比较运算符重载函数与拷贝构造函数的区别
原文链接: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) 一个对象需要通过另外一个对象进行初始化; 深拷贝和浅拷贝的定义可以简单理解成:如果一个类拥有资源(堆,或者是其它系统资源),当这个类的对象发生复制过程的时候,这个过程就可以叫做深拷贝,反之对象存在资源但复制过程并未复制资源的情况视为浅拷贝。