我想知道它运行为啥是这样子的,这个顺序怎么出来的?求给详细点的注释,#include using namespace std;class TPoint{private:int X,Y;public:\x05TPoint(int x,int y)\x05{ \x05\x05X=x;\x05 Y=y;\x05cout
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/18 01:44:20
我想知道它运行为啥是这样子的,这个顺序怎么出来的?求给详细点的注释,#include using namespace std;class TPoint{private:int X,Y;public:\x05TPoint(int x,int y)\x05{ \x05\x05X=x;\x05 Y=y;\x05cout
我想知道它运行为啥是这样子的,这个顺序怎么出来的?求给详细点的注释,
#include
using namespace std;
class TPoint
{private:
int X,Y;
public:
\x05TPoint(int x,int y)
\x05{
\x05\x05X=x;
\x05 Y=y;
\x05cout
我想知道它运行为啥是这样子的,这个顺序怎么出来的?求给详细点的注释,#include using namespace std;class TPoint{private:int X,Y;public:\x05TPoint(int x,int y)\x05{ \x05\x05X=x;\x05 Y=y;\x05cout
直接从执行结果来看吧,如有不明白的地方再追问:
constructor2035 //TPoint M(20,35);调用普通构造函数TPoint(int x,int y)得到的输出
copy initialization construction called
//TPoint N(M);这句话调用拷贝构造函数TPoint::TPoint(TPoint &p)得到的输出
constructor00//TPoint P(0,0);调用普通构造函数TPoint(int x,int y)得到的输出
至此,程序顺序执行到P=f(N);这里理解起来有点困难,先看一个概念:
在C++中,如果函数的返回值是类的对象,下面三种对象需要调用拷贝构造函数:
1) 一个对象以值传递的方式传入函数体//看f(N),对象N是以值传递的形式作为参数传入函数体
2) 一个对象以值传递的方式从函数返回//看f(N),返回值是TPoint类型
3) 一个对象需要通过另外一个对象进行初始化
copy initialization construction called//执行P=f(N);时,对象N是以值传递的形式作为参数传入函数体
OK//f(N)调用函数f(TPoint Q)得到
constructor3055//同样是f(N)调用函数f(TPoint Q)得到
copy initialization construction called//执行P=f(N);时,返回值是TPoint类型
//上述方式在执行拷贝构造函数的时候,都会生成一个临时对象
destructor called//临时对象R在函数f(TPoint Q)退出时会析构
destructor called//f(N)得到的临时对象析构
destructor called//P=f(N)赋值时得到的临时对象析构
P=3055//cout<<"P="<<P.Xcoord()<<P.Ycoord()<<endl;输出得到
destructor called//对象P析构
destructor called//对象N析构
destructor called//对象M析构