本文共 1351 字,大约阅读时间需要 4 分钟。
今天做C++ primer的习题,被复制构造函数和赋值符的区别弄晕了。简单地说,有一道题目如下描述:
class t1;
class t2 = t1;
我先看见有一个等号,以为就是赋值符来做的,其实并不是这样的。做一个实验好了:
- class CTest
- {
- public:
- CTest(); //构造函数
- CTest(const CTest &); //复制构造函数
- CTest & operator = (const CTest &); //赋值符
- };
- CTest::CTest()
- {
- cout<<"Constructor of CTest"<<endl;
- }
- CTest::CTest(const CTest & arg)
- {
- cout<<"Copy Constructor of CTest"<<endl;
- }
- CTest & CTest::operator = (const CTest & arg)
- {
- cout<<"Assign function of CTest"<<endl;
- }
- int main()
- {
- CTest a;
- CTest b(a);
- CTest c = a; //注意,这里仍然是使用复制构造函数
- a = c; //使用赋值符
- return 0;
- }
Constructor of CTest
Copy Constructor of CTest Copy Constructor of CTest Assign function of CTest一切都是很显然的了。
总结如下:
复制构造函数与赋值操作符之间的区别 复制构造函数又称拷贝构造函数,它与赋值操作符间的区别体现在以下几个方面 1.从概念上区分: 复制构造函数是构造函数,而赋值操作符属于操作符重载范畴,它通常是类的成员函数 2.从原型上来区分: 复制构造函数原型ClassType(const ClassType &);无返回值 赋值操作符原型ClassType& operator=(const ClassType &);返回值为ClassType的引用,便于连续赋值操作 3.从使用的场合来区分: 复制构造函数用于产生对象,它用于以下几个地方:函数参数为类的值类型时、函数返回值为类类型时以及初始化语句,例如(示例了初始化语句,函数参数与函数返回值为类的值类型时较简单,这里没给出示例) ClassType a; // ClassType b(a); //调用复制构造函数 ClassType c = a; //调用复制构造函数 而赋值操作符要求‘=’的左右对象均已存在,它的作用就是把‘=’右边的对象的值赋给左边的对象 ClassType e; Class Type f; f = e; //调用赋值操作符 4.当类中含有指针成员时,两者的意义有很大区别 复制构造函数需为指针变量分配内存空间,并将实参的值拷贝到其中;而赋值操作符它实现的功能仅仅是将‘=’号右边的值拷贝至左值,在左边对象内存不足时,先释放然后再申请。当然赋值操作符必须检测是否是自身赋值,若是则直接返回当前对象的引用而不进行赋值操作
转载地址:https://blog.csdn.net/love_hot_girl/article/details/12621513 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!