📄 +
字号:
【例5.9】 演示调用构造函数及析构函数的综合例题。
下面这个程序综合演示了调用构造函数、调用复制构造函数及调用析构函数的顺序,并演示了调用复制构造函数的3种不同情况。另外还比较了函数使用对象和对象的引用为参数的情况。
#include <iostream>
using namespace std;
class Point{
private:
int X,Y;
public:
Point(int a=0,int b=0)
{X=a; Y=b;cout<<″Initializing″<<endl;}//构造函数
Point(const Point &p);//复制构造函数
int GetX(){return X;}
int GetY(){return Y;}
void Show(){cout<<″X=″<<X<<″,Y=″<<Y<<endl;}
~Point(){cout<<″delete...″<<X<<″,″<<Y<<endl;}
};
Point∷Point(const Point &p)//定义复制构造函数
{ X=p.X;
Y=p.Y;
cout<<″Copy Initializing ″<<endl;
}
void display(Point p)//Point类的对象作为函数的形参
{p.Show();}
void disp(Point&p)//Point类对象的引用作为函数的形参
{p.Show();}
Point fun()//函数的返回值为Point类的对象
{ PointA(101,202);
return A;
}
void main(){//主函数
Point A(42,35);//对象A
Point B(A);//①用A初始化B,第1次调用复制构造函数
Point C(58,94);//对象C
cout<<″called display(B)″<<endl;
display(B);//②对象B作为display的实参
//第2次调用复制构造函数
cout<<″Next...″<<endl;
cout<<″called disp(B)″<<endl;
disp(B);
cout<<″call C=fun()″<<endl;
C=fun();//③fun的返回值赋给对象C
//第3次调用复制构造函数
cout<<″called disp(C)″<<endl;
disp(C);
cout<<″out...″<<endl;
}
输出结果及注释如下:
Initializing//创建对象A
Copy Initializing//调用复制构造函数,使用对象A初始化B
Initializing//创建对象C
called display(B)//用对象B作为参数
Copy Initializing//需要调用复制构造函数
X=42,Y=35//进入函数体执行语句
delete...42,35//退出函数时,需要调用析构函数清除对象
Next...
called disp(B)//使用引用作为参数,则不需要调用复制构造函数
X=42,Y=35//进入函数体执行语句
call C=fun()//C使用函数fun()的返回值
Initializing//在函数fun()内创建对象A
Copy Initializing//调用复制构造函数返回值
delete...101,202//返回值给对象C,调用析构函数清除临时对象A
delete...101,202//退出函数体,调用析构函数清除对象A
called disp(C)//使用引用作为参数
X=101,Y=202//进入函数体执行语句
out...
delete...101,202//调用析构函数清除对象C
delete...42,35//调用析构函数清除对象B
delete...42,35//调用析构函数清除对象A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -