面向对象程序设计实验 - 实验2 类和对象:类的构建

实验二 类和对象——类的构建

目录

实验二 类和对象——类的构建

2.1 实验目的

2.2 实验内容

2.2.1程序阅读

2.2.2 程序设计

2.3思考题


2.1 实验目的

1.类的定义;

2.类对象的使用;

3.类成员变量的定义和使用;

4.类成员函数的定义和使用;

5.理解类的作用域;

6.理解类的声明;

7.理解类中private和public权限的声明依据。

2.2 实验内容

2.2.1程序阅读

1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。

#include <iostream>

class CDate

{

       void Set(int m, int d, int y )

       {

              month = m ; 

              day = d ;

              year = y ;

       }

       int IsLeapYear()

       {

              return (year%4 == 0 && year%100 != 0)||(year%400 == 0);

       }

public:

       void Print()

       {

              cout<<month<<"/"<<day<<"/"<<year<<endl;

       }

private:

       int  month;    int  day;    int  year;

};

void main()

{

       CDate  a; -----------------------------------------------------

    a.Set(10,15,2007) ;

    a.Print();

}

问题一:以上程序编译能通过吗,为什么,应该如何改正?

答:不能编译通过。(1)Set和IsLeapYear未声明为public,无法调用。(2)未声明命名空间。 (3)主函数返回值为void。修改后代码如下:

#include <iostream>

using namespace std;

class CDate{

    public:

        void Set(int m, int d, int y ){

            month = m ; 

            day = d ;

            year = y ;

        }

        int IsLeapYear(){

            return (year%4 == 0 && year%100 != 0)||(year%400 == 0);

        }

        void Print(){

            cout<<month<<"/"<<day<<"/"<<year<<endl;

        }

    private:

        int  month;    int  day;    int  year;

};



int main(){

    CDate  a;

    a.Set(10,15,2007) ;

    a.Print();

}

问题二:类CDate中分别有哪些成员函数和成员变量,它们分别属于哪种访问权限?

答:成员函数有Set(int m, int d, int y )、IsLeapYear()、Print(),访问权限为public。

成员变量为month、day、year,访问权限为private。

问题三:①处语句的意思是什么?

答:新建一个CDate类对象,命名为a。

2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。

#include <iostream>

int month;//全局变量 

int day; 

int year;

void Set(int m,int d,int y) -----------------------------------------------------a

{

       ::month=m; -----------------------------------------------------

       ::day=d;

       ::year=y;

}

class CDate

{

public:

       void Set(int m,int d,int y) -----------------------------------------------------b

       {

              ::Set(m,d,y); -----------------------------------------------------

       }

       void Print()

       {

              cout<<month<<"/"<<day<<"/"<<year<<endl;

       }

private:

       int month; //成员变量

       int day;

       int year;

};

void main()

{

       CDate  a;

    a.Set(10,15,2007) ;

       a.Print();

}

问题一:①处是在给成员变量赋值,还是在给全局变量赋值,如果去掉域作用符::,程序是否还能正确运行?

答:①处是在给全局变量赋值。去掉::后,程序无法正常运行。

问题二:②处调用的哪个函数,如果去掉域作用符::,程序是否还能正确运行?

答:②处调用的全局Set函数。去掉::后,程序无法正常运行。

问题三:该程序的输出结果是什么,试解释该输出结果。

答:输出结果为4250192/7077760/4250286

程序调用a.Set(10,15,2007) 时,使用::调用全局Set函数修改全局变量month、day、year。但调用a.Print()输出时,输出的为成员变量month、day、year,成员变量未初始化,故为随机值。

2.2.2 程序设计

1.试设计一个复数类,该类有实部和虚部两个成员数据,成员数据采用私有访问权限,同时该类有两个共有成员函数,分别用来设置成员数据和输出成员数据,在主函数中分别采用对象方式,指针方式和引用方式来调用该类的公有函数设置和输出成员数据。

答:   

#include <iostream>

using namespace std;



class CNum{

    private:

        int a;//实部

        int b;//虚部

    public:

        void set(int _a,int _b){

            a=_a;

            b=_b;

        }

        void print(){

            if(b==0)

                cout<<a<<endl;

            else

                cout<<a<<"+"<<b<<"i"<<endl;

        }

};



int main(){

    int a,b;

   

    cout<<"请输入复数的实部和虚部,以空格分割:";

    cin>>a>>b;

    CNum c;//对象方式

    c.set(a,b);

    c.print();

   

    cout<<"请输入复数的实部和虚部,以空格分割:";

    cin>>a>>b;

    CNum *c1;//指针方式

    c1=&c;

    (*c1).set(a,b);

    (*c1).print();

   

    cout<<"请输入复数的实部和虚部,以空格分割:";

    cin>>a>>b;

    CNum &c2=c;//引用方式

    c2.set(a,b);

    c2.print();

}

2.3 思考题

1.试指出以下程序的错误,并改正之。

#include <iostream>

class CPoint

{

public:

unsigned x,

unsigned y;

    bool IsInCircle(CCircle *Circle)

    {

              return (((x-Circle->Center.x)*(x-Circle->Center.x)

                     +(y-Circle->Center.y)*(y-Circle->Center.y))<=Circle->Radius*Circle->Radius);

       }

};

class CCircle

{

public:

    unsigned Radius;

    CPoint Center;

};

void main()

{

}

答:CCircle类在定义前被使用,应调整顺序且将CPoint中成员函数实现放在两个类的定义后。修改后代码如下:

#include <iostream>

using namespace std;



class CCircle;



class CPoint{

    public:

        unsigned x,y;

        bool IsInCircle(CCircle *Circle);

};



class CCircle{

    public:

        unsigned Radius;

        CPoint Center;

};



bool CPoint::IsInCircle(CCircle *Circle){

    return (((x-Circle->Center.x)*(x-Circle->Center.x)+(y-Circle->Center.y)*(y-Circle->Center.y))<=Circle->Radius*Circle->Radius);

}



int main(){

}

  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_41626672

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值