[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) 一个对象需要通过另外一个对象进行初始化;
深拷贝和浅拷贝的定义可以简单理解成:如果一个类拥有资源(堆,或者是其它系统资源),当这个类的对象发生复制过程的时候,这个过程就可以叫做深拷贝,反之对象存在资源但复制过程并未复制资源的情况视为浅拷贝。
原文链接: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) 一个对象需要通过另外一个对象进行初始化;
深拷贝和浅拷贝的定义可以简单理解成:如果一个类拥有资源(堆,或者是其它系统资源),当这个类的对象发生复制过程的时候,这个过程就可以叫做深拷贝,反之对象存在资源但复制过程并未复制资源的情况视为浅拷贝。
相关文章推荐
- 重载赋值运算符与拷贝构造函数的区别
- 类的赋值运算符重载和拷贝构造函数
- 【面向对象程序设计常见面试题】赋值运算符和拷贝构造函数的区别与联系?(3)
- 赋值运算符和拷贝构造函数的区别与联系
- 拷贝构造函数和赋值运算符区别 2010-01-03
- 拷贝构造函数 和 赋值运算符的区别
- 拷贝构造函数和赋值运算符区别
- 使用拷贝构造函数与使用重载的“=”重载函数的区别
- 20170825_string构造函数、析构函数、拷贝构造函数以及重载赋值运算符
- 赋值运算符和拷贝构造函数的区别与联系
- 拷贝构造函数和赋值运算符 区别
- [C++基础]046_拷贝构造函数与重载赋值运算符(精深版解释)
- 拷贝构造函数和赋值运算符 区别
- 拷贝构造函数、赋值运算符、构造函数的区别及关系?
- C++拷贝构造函数与重载‘=’的区别
- 赋值运算符与拷贝构造函数的区别与联系(转)
- zz C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝
- c/c++ 构造函数、拷贝构造函数、析构函数和赋值运算符重载
- C++ 中拷贝构造函数和赋值运算符的区别
- 何时需要自定义拷贝构造函数和赋值运算符及二者区别