zoukankan      html  css  js  c++  java
  • 【C++学习】复制构造函数和赋值运算符根本的不同

    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/

    首先要说明的是,若用户没有定义,C++隐式声明一个复制构造函数和一个赋值运算符(完成按数据成员复制的动作)。二者很像,但是在下边这点上有很大的不同:复制构造函数是只在对象实例化时才会被调用,也就是说,在复制构造函数调用期间,这个对象处于一个未决状态(直到复制构造函数被成功调用),另外复制构造函数不返回任何值,void都没有。而赋值运算符则在一个现存的对象被赋予新的值时被调用,并且它有返回值。

    在下边这个例子中我们能看到并不是出现“=”就是调用赋值构造函数:

    #include 
    
    using namespace std;
    
    class Test
    
    {
    
    public:
    
     Test()
    
     {
    
      ctor_count++;
    
      cout<<"ctor "<
     }
    
     Test(const Test & r)
    
     {
    
      ctor_count++;
    
      cout<<"copy ctor "<
     }
    
     Test & operator= (const Test& r)
    
     {
    
      ctor_count++;
    
      cout<<"assignment op "<
      return *this;
    
     }
    
    private:
    
     static int ctor_count; //only a declaration
    
    };
    
    int Test::ctor_count=0; // definition + initialization
    
    int main()
    
    {
    
        Test test;
    
        Test test1=test;
    
        Test test2(test);
    
        Test test3=test2=test1;
    
        return 0;
    
    }
    

    运行结果为

    [root@localhost ~]# ./a.out
    ctor 1
    copy ctor 2
    copy ctor 3
    assignment op 4
    copy ctor 5

    我们看到实例化test对象时调用了默认构造函数,test1使用了复制构造函数(因为这是一个新的对象产生),test2时也是用了复制构造函数,而test2=test1则使用了赋值构造函数(没有新的对象产生),test2=test3则使用了复制构造函数,原因同上。

     

    所以要看是不是有新的对象产生,才能决定到底是调用了复制构造函数,还是赋值运算符。

    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/


                   作者:gnuhpc
                   出处:http://www.cnblogs.com/gnuhpc/
                   除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


    分享到:

  • 相关阅读:
    104. 二叉树的最大深度
    1120. 子树的最大平均值
    1121. 将数组分成几个递增序列
    1118. 一月有多少天
    1110. 删点成林
    102. 二叉树的层次遍历
    145. 二叉树的后序遍历
    94. 二叉树的中序遍历
    144. 二叉树的前序遍历
    剑指offer-0x04
  • 原文地址:https://www.cnblogs.com/gnuhpc/p/2811923.html
Copyright © 2011-2022 走看看