您的位置:首页 > 其它

拷贝构造函数与赋值运算符的认识

2013-11-11 13:39 99 查看

一、拷贝构造函数

使用原则:当对象中含有类型为指针的成员变量时,重载拷贝构造函数能够防止两对象共享同一成员指针的问题。

classTest{public:Test(void);// 默认构造函数Test(constTest& t);// 拷贝构造函数~Test(void);// 析构函数private:char* name;// 指针成员变量};Test::Test(void){
name = NULL;}Test::~Test(void){delete[] name;
name = NULL;}Test::Test(constTest& t)// :Parent(t)   // 如果是调用父类的拷贝构造函数则这样调{delete[] name;
name =newchar[strlen(t.name)+1];
strcpy(name, t.name);}int main(){Test* t1 =newTest();// 调用默认构造函数Test t2 =*t1;// 调用拷贝构造函数delete t1;// 析构t1// delete *t2;          // 析构t2,此处不需要显式析构return0;}


二、赋值运算符

classTest{public:Test(void);~Test(void);Test&operator=(constTest& t);private:char* name;};Test::Test(void){
name = NULL;}Test::~Test(void){delete[] name;
name = NULL;}Test&Test::operator=(constTest& t){// Parent::operator=(t);    // 如果是继承关系中调用父类的赋值运算符if(this!=&t)// 如果右边的对象与左边的对象不是同一对象时才赋值{delete[] name;
name =newchar[strlen(t.name)+1];
strcpy(name, t.name);}return*this;// 返回的是该对象的引用}int main(){Test* t1 =newTest();// 调用默认构造函数Test t2;// 同上
t2 =*t1;// 调用赋值运算符把t1的值赋给t2delete t1;// 析构t1// delete &t2;              // 析构t2,此处不需要显式析构t2return0;}


三、总结

拷贝构造函数与赋值运算符的重载都是根据是否有指针类型的成员变量,如果有就需要重载来防止成员指针指向的地址是相同的。

面试题 14:谈谈你对拷贝构造函数和赋值运算符的认识
拷贝构造函数和赋值运算符重载有以下两个不同之处:
(1)拷贝构造函数生成新的类对象,而赋值运算符不能。
(2)由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象
是否和新建对象相同。而赋值运算符则需要这个操作,另外赋值运算中如果原来的对象中有内存分配要
先把内存释放掉
注意:当有类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不要使用默认
的。

C++的空类有哪些成员函数

 缺省构造函数。
 缺省拷贝构造函数。
 缺省析构函数。
 缺省赋值运算符。
 缺省取址运算符。
 缺省取址运算符 const。
注意:有些书上只是简单的介绍了前四个函数。没有提及后面这两个函数。但后面这两个函数也是空类的默认函数。另外需要注意的是,只有当实际使用这些函数的时候,编译器才会去定义它们。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: