/*分析下列程序的输出结果,并回答下列问题: ① 该程序中共调用过几次拷贝构造函数?是在什么情况下调用的拷贝构造函数? // 1 用一个已知对象初始化一个正在被创建的对象 调用复制构造函数 // 2 函数形式参数为对象时 ,实参对象向形参对象传值 调用复制构造函数 // 3 函数的返回值时对象时 ,当需要获取返回值时 调用复制构造函数 ② 临时对象是在何时被创建的?又在何时被释放? // 临时对象时在 fun函数的return R;时被创建的,完成返回值的传递后,被系统释放 ③ 临时对象起什么作用? // 起到了值得暂存作用 */ #include <iostream> using namespace std; class Tpoint1 { public: Tpoint1(int x,int y)//构造函数 { X=x; Y=y; } Tpoint1(Tpoint1 &p);//复制构造函数 ~Tpoint1( ) // 析构函数 { cout<<"Destructor called\n"; } int Xcoord( ) { return X; } int Ycoord( ) { return Y; } private: int X,Y; }; Tpoint1::Tpoint1(Tpoint1 &p)//复制构造函数的实现 { X=p.X; Y=p.Y; cout<<"Copy-initialization Constructor called\n"; } //普通函数 Tpoint1 fun(Tpoint1 Q)//2 Copy-initialization Constructor called // 实参向形参传递参数会调用复制构造函数 传递参数的过程 Tpoint1 Q = N 实际也是用一个已知对象N初始化一个正在被创建的对象Q { cout<<"ok\n";//3 ok int x=Q.Xcoord( )+10; //22 int y=Q.Ycoord( )+15; //35 Tpoint1 R(x,y);// return R; //4 Copy-initialization Constructor called //R将要被系统回收时 系统会创建一个临时的无名对象获取R的值 实际过程是 Tpoint1 tmep = R; 实际也是用一个已知对象R初始化一个正在被创建的无名临时对象Temp //5 Destructor called //析构R //6 Destructor called //析构Q } int main( ) { Tpoint1 M(12,20),P(0,0),S(0,0); Tpoint1 N(M);// 1 Copy-initialization Constructor called //调用第一次复制构造函数 用一个已知对象M初始化一个正在被创建的对象N P=fun(N);7 Destructor called //析构temp S=M; cout<<"P="<<P.Xcoord( )<<","<<P.Ycoord( )<<endl;//8 P=22,35 cout<<"S="<<S.Xcoord( )<<","<<S.Ycoord( )<<endl;//9 S=12,20 //10 Destructor called //11 Destructor called //12 Destructor called //13 Destructor called }
复制构造函数三次调用总结
于 2022-04-29 15:03:35 首次发布