实验目的和要求
1、熟悉类的定义格式和类中成员的访问权限。
2、构造函数与析构函数的调用时机与顺序。
3、掌握对象的定义以及对象的初始化的时机与方法。
实验内容
1、下面程序sy3_1.cpp中用ERROR标明的语句有错吧,在不删除和增加代码行的情况下,改正错误语句,使其正确运行。
运行程序如下:
- #include<iostream>
- using namespace std;
- class Aa
- {
- public:
- Aa(int i=0){a=i;cout<<"Constructor"<<a<<endl;}
- ~Aa(){cout<<"Destructor"<<a<<endl;}
- void print(){cout<<a<<endl;}
- private:
- int a;
- };
- int main()
- {
- Aa a1(1),a2(2);
- a1.print();
- cout<<a2.a<<endl;//ERROR
- return 0;
- }
错误如下:
修改程序如下:
- #include<iostream>
- using namespace std;
- class Aa
- {
- public:
- Aa(int i=0){a=i;cout<<"Constructor"<<a<<endl;}
- ~Aa(){cout<<"Destructor"<<a<<endl;}
- void print(){cout<<a<<endl;}
- private:
- int a;
- };
- int main()
- {
- Aa a1(1),a2(2);
- a1.print();
- a2.print();
- return 0;
- }

2、调试下列程序:
- #include<iostream>
- using namespace std;
- class TPoint
- {
- public:
- TPoint(int x=0,int y=0){X=x,Y=y;}
- TPoint(TPoint &p);
- ~TPoint(){cout<<"Destructor is called\n";}
- int getx(){return X;}
- int gety(){return Y;}
- private:
- int X,Y;
- };
- TPoint::TPoint(TPoint &p)
- {
- X=p.X;
- Y=p.Y;
- cout<<"Copy-initialization Constructor is called\n";
- }
- int main()
- {
- TPoint p1(4,9);
- TPoint p2(p1);
- TPoint p3=p2;
- TPoint p4,p5(2);
- cout<<"p3=("<<p3.getx()<<","<<p3.gety()<<")\n";
- return 0;
- }
在程序中,将TPoint类的带有两个参数的构造函数进行修改,在函数体内增添下述语句:
cout<<"Constructor is called\n";
(1)写出程序的输出结果,并解释输出结果;
程序如下:
- #include<iostream>
- using namespace std;
- class TPoint
- {
- public:
- TPoint(int x=0,int y=0){X=x,Y=y;}
- TPoint(TPoint &p);
- ~TPoint(){cout<<"Destructor is called\n";}
- int getx(){return X;}
- int gety(){return Y;}
- private:
- int X,Y;
- };
- TPoint::TPoint(TPoint &p)
- {
- X=p.X;
- Y=p.Y;
- cout<<"Constructor is called\n";
- cout<<"Copy-initialization Constructor is called\n";
- }
- int main()
- {
- TPoint p1(4,9);
- TPoint p2(p1);
- TPoint p3=p2;
- TPoint p4,p5(2);
- cout<<"p3=("<<p3.getx()<<","<<p3.gety()<<")\n";
- return 0;
- }
运行结果如下:

(2)按下列要求进行调试:
在主函数体内,添加下列说明语句:
TPoint p4,p5(2);
- #include<iostream>
- using namespace std;
- class TPoint
- {
- public:
- TPoint(int x,int y){X=x,Y=y;}
- TPoint(TPoint &p);
- ~TPoint(){cout<<"Destructor is called\n";}
- int getx(){return X;}
- int gety(){return Y;}
- private:
- int X,Y;
- };
- TPoint::TPoint(TPoint &p)
- {
- X=p.X;
- Y=p.Y;
- cout<<"Copy-initialization Constructor is called\n";
- cout<<"Constructor is called\n";
- }
- int main()
- {
- TPoint P4,P5(2);
- TPoint p1(4,9);
- TPoint p2(p1);
- TPoint p3=p2;
- cout<<"p3=("<<p3.getx()<<","<<p3.gety()<<")\n";
- return 0;
- }
调试程序会出现什么现象?为什么?如何解决?(提示:对已有的构造函数进行适当修改)结合运行结果分析如何使用不同的构造函数创建不同的对象。
现象:

为什么:因为在类中没有定义不带参数和带一个参数的构造函数;
如何解决:将带两个参数的构造函数改为缺省的构造函数,就是可以将TPoint(int x,int y)改为TPoint(int x=0,int y=0) ; 在运行过程中,TPoint p1(4,9)和TPoint p4,p5(2);调用了构造函数,而TPoint p2(p1)和TPoint p3=p2是使用了拷贝构造函数。如下所示:
- //sy3_2.cpp
- #include<iostream>
- using namespace std;