当前位置:编程学习 > C/C++ >>

C++ 拷贝构造函数

一、整体代码
     Test.h
[cpp] 
#ifndef _TEST_H_  
#define _TEST_H_  
class Test  
{  
public:  
// 如果类不提供任何一个构造函数,系统将为我们提供一个不带参数的  
// 默认的构造函数  
   Test();  
explicit Test(int num);  
   Test(const Test& other);  
void Display();  
   Test&operator=(const Test& other);  
~Test();  
public:  
int num_;  
};  
#endif// _TEST_H_  
 
      Test.cpp
[cpp] 
#include"Test.h"  
#include<iostream>  
usingnamespace std;  
// 不带参数的构造函数称为默认构造函数  
Test::Test() : num_(0)  
{  
  //num_ = 0;  
   cout<<"Initializing Default"<<endl;  
}  
Test::Test(int num) : num_(num)  
{  
   //num_ = num;  
   cout<<"Initializing "<<num_<<endl;  
}  
Test::Test(const Test& other) : num_(other.num_)  
{  
   //num_ = other.num_;  
   cout<<"Initializing with other "<<num_<<endl;  
}  
Test::~Test()  
{  
   cout<<"Destroy "<<num_<<endl;  
}  
void Test::Display()  
{  
   cout<<"num="<<num_<<endl;  
}  
Test& Test::operator=(const Test& other)  
{  
   cout<<"Test::operator="<<endl;  
if (this==&other)  
return*this;  
   num_ = other.num_;  
return*this;  
}  
 
      01.cpp
[cpp]  
01.cpp  
#include"Test.h"  
#include<iostream>  
usingnamespace std;  
Test TestFun(Test t)  
{  
   t.num_=12;  
   return t;  
}  
Test& TestFun2(Test t)  
{  
   return t;  
}  
Test TestFun3(Test& t)  
{  
   return t;  
}  
Test& TestFun4(Test& t)  
{  
  //return const_cast<Test&>(t);  
   return t;  
}  
int main(void)  
{  
   Test t(10);      
   Test t2 = TestFun(t);  
   cout<<"........"<<endl;  
   return 0;  
}  
 
二、运行结果
      1、Test t2 = TestFun(t);
       
      (1)Test t(10) :生成一个对象1(num_是10),对应Initializing 10
      (2)把t对象传递到形式参数时:调用拷贝构造函数,由对象1生成了一个对象2(num_是10),之后又改变了num_为12,对应Initializing with other10
      (3)返回值时:调用了拷贝构造函数,由对象2生成了一个对象3(num_是12),对应Initializing with other12
      (4)Test t2 = TestFun(t):t2接管了对象3,不重新申请地址空间
      (5)TestFun返回后:对象2销毁了,对应Destroy 12
      (6)............
      (7)程序结束后:首先销毁听t2(接管了对象1),然后销毁对象1,对应Destroy 12 ,Destroy 10
            TestFun(t) 此时没有对象接管,运行结果如下:
       
     (1)Test t(10) :生成一个对象1(num_是10),对应Initializing 10
     (2)把t对象传递到形式参数时:调用拷贝构造函数,由对象1生成了一个对象2(num_是10),之后又改变了num_为12,对应Initializing with other10
     (3)返回值时:调用了拷贝构造函数,由对象2生成了一个对象3(num_是12),对应Initializing with other12
     (4)TestFun返回后:对象3销毁,对象2销毁,对应Destroy 12,Destroy 12
     (5)..........
     (6)程序结束后:销毁对象1,对应Destroy 10
         2、Test t2 = TestFun2(t);
        
      (1)Test t(10) :生成一个对象1(num_是10),对应Initializing 10
      (2)把t对象传递到形式参数时:调用拷贝构造函数,由对象1生成了一个对象2(num_是10),对应Initializing with other 10
      (3)Test t2 = TestFun2(t):由对象2生成了对象3(num_是10),对应Initializing with other 10
      (4)TestFun2返回后:对象2销毁,对应Destory 10
      (5)...........
      (6)程序结束后:销毁对象3,销毁对象1,对应Destory 10,Destory 10
        3、Test t2 = TestFun3(t);
        
      (1)Test t(10) :生成一个对象1(num_是10),对应Initializing 10
      (2)返回值时:由对象1生成了对象2(num_是10),对应Initializing with other 10
      (3)Test t2 = TestFun3(t):t2对象接管了对象2
      (4)...........
      (5)程序结束后:销毁t2对象,销毁对象1,对应Destroy 10,Destroy 10
         4、Test t2 = TestFun4(t);
         
      (1)Test t(10) :生成一个对象1(num_是10),对应Initializing 10
      (2)Test t2 = TestFun4(t):由对象1生成了对象t2(num_是10),对应Initializing with other 10
      (3)........
      (4)程序结束后:销毁t2对象,销毁对象1,对应Destroy 10,Destroy 10
 
三、什么时候会调用拷贝构造函数
         一个对象初始化另一个全新的对象时,会调用,如Test t;  Test t2 = t;
         Test t ; Test t2; t2=t1;会调用赋值语句。
 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,