发布日期:2015-12-29 11:46 来源: 标签: 编程语言 C++教程 C++对象 C++拷贝与赋值
本章我们主要学习C++中对象的拷贝与赋,下面我们就做一下具体讲解,希望大家多多支持中国站长网络学院。
在使用C++编写一个类时,有很多人知道什么时候需要实现拷贝构造函数和赋值操作,但不知道什么时候拷贝构造函数被调用,什么时候赋值操作被调用,甚至把二者混为一谈。
拷贝构造函数,顾名思义,等于拷贝 + 构造。它肩负着创建新对象的任务,同时还要负责把另外一个对象拷贝过来。比如下面的情况就调用拷贝构造函数:
    cstring str = strother; 
赋值操作则只含有拷贝的意思,也就是说对象必须已经存在。比如下面的情况会调用赋值操作。
    str = strother; 
不过有的对象是隐式的,由编译器产生的代码创建,比如函数以传值的方式传递一个对象时。由于看不见相关代码,所以不太容易明白。不过我们稍微思考一下,就会想到,既然是根据一个存在的对象拷贝生成新的对象,自然是调用拷贝构造函数了。
拷贝构造函数对同一个对象来说只会调用一次,而且是在对象构造时调用。此时对象本身还没有构造,无需要去释放自己的一些资源。而赋值操作可能会调用多次,你在拷贝之前要释放自己的一些资源,否则会造成资源泄露。
我们写个测试程序来验证一下我们的想法:
class cstring  
{   
public:  
cstring();  
cstring(const char* pszbuffer);  
~cstring();  
cstring(const cstring& other);  
const cstring& operator=(const cstring& other);  
private:  
char* m_pszbuffer;;  
};   
cstring::cstring()  
{  
printf("cstring::cstring\n");  
m_pszbuffer = null;  
return;   
}   
cstring::cstring(const char* pszbuffer)  
{  
printf("cstring::cstring(const char* pszbuffer)\n");  
m_pszbuffer = pszbuffer != null ? strdup(pszbuffer) : null;  
return;  
}  
cstring::~cstring()  
{  
printf("%s\n", __func__);  
if(m_pszbuffer != null)  
{  
free(m_pszbuffer);  
m_pszbuffer = null;  
}  
return;  
}  
cstring::cstring(const cstring& other)  
{  
if(this == &other)  
{  
return;  
}  
printf("cstring::cstring(const cstring& other)\n");  
m_pszbuffer = other.m_pszbuffer != null ? strdup(other.m_pszbuffer) : null;  
}  
const cstring& cstring::operator=(const cstring& other)  
{  
printf("const cstring& cstring::operator=(const cstring& other)\n");  
if(this == &other)  
{  
return *this;  
}  
if(m_pszbuffer != null)  
{  
free(m_pszbuffer);  
m_pszbuffer = null;  
}  
m_pszbuffer = other.m_pszbuffer != null ? strdup(other.m_pszbuffer) : null;  
return *this;  
}  
void test(cstring str)  
{  
cstring str1 = str;  
return;  

int main(int argc, char* argv[])  
{  
cstring str;  
cstring str1 = "test";  
cstring str2 = str1;  
str1 = str;  
cstring str3 = str3;  
test(str);  
return 0;  

相关评论

专题信息
    C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持多种编程范式 --面向对象编程、泛型编程和过程化编程。最新正式标准C++于2014年8月18日公布。 其编程领域众广,常用于系统开发,引擎开发等应用领域,是至今为止最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性! 本教程从基础讲解了C++语言,希望对大家有所帮助,望多多支持中国站长网络学院。