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#

  • 相关阅读:
    Leetcode 118:Pascal's Triangle 杨辉三角
    Leetcode 498:对角线遍历Diagonal Traverse(python3、java)
    Leetcode加一 (java、python3)
    Leetcode747至少是其他数字两倍的最大数
    python之爬虫(爬取.ts文件并将其合并为.MP4文件——以及一些异常的注意事项)
    杭电oj1717——小数化分数(java实现)
    杭电oj_1713——相遇周期(java实现)
    杭电oj1995——汉诺塔V(java实现)
    杭电oj 2098——分拆素数和(包含如何判断质数及优化),java实现
    杭电oj————2057(java)
  • 原文地址:https://www.cnblogs.com/liushui-sky/p/5920050.html
Copyright © 2011-2022 走看看