您的位置:首页 > 其它

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

2011-03-02 20:41 183 查看
比较运算符重载函数与拷贝构造函数的区别

原文链接: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) 一个对象需要通过另外一个对象进行初始化;

深拷贝和浅拷贝的定义可以简单理解成:如果一个类拥有资源(堆,或者是其它系统资源),当这个类的对象发生复制过程的时候,这个过程就可以叫做深拷贝,反之对象存在资源但复制过程并未复制资源的情况视为浅拷贝。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: