[ZZ]重载赋值运算符与拷贝构造函数的区别

    技术2022-05-20  33

    比较运算符重载函数与拷贝构造函数的区别

     

    原文链接:http://blog.sina.com.cn/s/blog_4c98b9600100api4.html

    #include <iostream> using namespace std; #include <cstring> class Namelist {

       char *name;     public:         Namelist (char *p)//带参数的构造函数         {          name= new char[strlen(p)+1];          if (name!=0) strcpy(name,p);         }         Namelist(){ };//缺省构造函数         Namelist(Namelist&);//拷贝构造函数         Namelist& operator=(char *p );         Namelist& operator=(  Namelist& );             void display(){cout<<name<<endl;}         ~ Namelist ()         {          delete [] name ;         } }; Namelist::Namelist(Namelist& a)//定义拷贝构造函数 {     name= new char[strlen(a.name)+1];     if (name!=0) strcpy(name,a.name); } Namelist& Namelist::operator=( char *p)// //第一个重载赋值运算符,完成用常量给对象赋值 {     name= new char[strlen(p)+1];     if (name!=0) strcpy(name,p);     return *this; }     Namelist& Namelist::operator=(  Namelist& a) //第二个重载赋值运算符,完成类对象之间的赋值 {     if (this!=&a)//首先查看是否赋值给自身,如果不是     {         delete[] name;//那么重新给它分配所需空间并拷贝字符串,保证目标对象和原对象各自拥有自己的拷贝字符串,从而完成深拷贝         name=new char[strlen(a.name)+1];         if (name!=0) strcpy(name,a.name);     }     return *this; }     int main() {     Namelist n1("first object"),n2("second object");//调用带参数的构造函数     Namelist n3;//缺省构造函数     cout<<"赋值前的数据:"<<endl;     n1.display();     n2.display();     n3="third object";//调用第一个重载赋值运算符函数     n2=n1;//调用第二个重载赋值运算符函数     Namelist n4(n2);//调用拷贝构造函数函数     Namelist n5=n3;//调用拷贝构造函数函数     Namelist n6="sixth object";//调用带参数的构造函数等同于()的方法     cout<<"赋值后的数据:"<<endl;     n1.display();     n2.display();     n3.display();     n4.display();     n5.display();     return 0; } 总结:拷贝构造函数发生在下面三种情况下: 在C++中,下面三种对象需要调用拷贝构造函数: 1) 一个对象以值传递的方式传入函数体; 2) 一个对象以值传递的方式从函数返回; 3) 一个对象需要通过另外一个对象进行初始化; 深拷贝和浅拷贝的定义可以简单理解成:如果一个类拥有资源(堆,或者是其它系统资源),当这个类的对象发生复制过程的时候,这个过程就可以叫做深拷贝,反之对象存在资源但复制过程并未复制资源的情况视为浅拷贝。 

    最新回复(0)