zoukankan      html  css  js  c++  java
  • C++复制构造函数和赋值符的区别

    今天做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

    一切都是很显然的了。

    http://hi.baidu.com/calrincalrin/blog/item/b313045023fd66998d543041.html总结如下:

    复制构造函数与赋值操作符之间的区别
    复制构造函数又称拷贝构造函数,它与赋值操作符间的区别体现在以下几个方面
    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.当类中含有指针成员时,两者的意义有很大区别
    复制构造函数需为指针变量分配内存空间,并将实参的值拷贝到其中;而赋值操作符它实现的功能仅仅是将‘=’号右边的值拷贝至左值,在左边对象内存不足时,先释放然后再申请。当然赋值操作符必须检测是否是自身赋值,若是则直接返回当前对象的引用而不进行赋值操作。

    转自:http://blog.csdn.net/randyjiawenjie/article/details/6666937#

  • 相关阅读:
    loaded some nib but the view outlet was not set
    指标评比
    IOS DEVELOP FOR DUMMIES
    软件测试题二
    javascript select
    DOM节点类型详解
    mysql操作
    UVA 10055
    solutions for 'No Suitable Driver Found For Jdbc'
    解决git中文乱码问题
  • 原文地址:https://www.cnblogs.com/liushui-sky/p/5920050.html
Copyright © 2011-2022 走看看