不考虑任何编译器优化(如:NRVO),下述代码的第10行会发生

 

A.    一次默认构造函数,一次拷贝构造函数,一次析构函数,一次(拷贝赋值运算符)operator=
B.    二次拷贝构造函数,一次析构函数
C.    一次(拷贝赋值运算符)operator=,一次析构函数
D.    一次拷贝构造函数,一次析构函数,一次(拷贝赋值运算符)operator=

2 收藏


直接登录
最新评论
  • Wenxuan   2015/12/05

    b1以引用方式传入func,不存在构造行为;func返回的是值类型而非引用,存在一次拷贝构造;func返回的是一个右值(临时值),赋值给b2的过程调用一次拷贝赋值运算符;b2赋值完成后,右值结束生命周期,调用一次析构函数。
    故D选项正确。

    •   2016/01/14

      看了您的回复后我觉得应该是A吧,b1(或b2)应该调用了一次默认的构造函数,然后编译器会为b2(或b1)调用一次拷贝构造函数来初始化,然后才会有后面的事情发生。纯属个人理解

      • Wenxuan   2016/01/14

        是不是看漏了题目(题目中说第10行)?不过即使把第九行也包括进来的话,也应该是在D选项所述的基础上多了两次默认构造函数的调用吧?

  • 破晓   2015/12/05

    b2 一次析构, 然后再加上一次拷贝运算符。
    答案是C?

  • 小巍   2015/12/06

    选d,答案是?

  • 王先生 学生 2015/12/06

    答案选D 在func(b1)处会调用一次拷贝构造函数,在函数func()内部会调用一次析构函数来析构rhs,在b2=func(b1)处会调用一次operator=

    • Wenxuan   2015/12/07

      答案的确是D,但似乎并不是这样解释的。b1是按引用传入func的,调用处不存在构造,同样func内部持有的是b1的引用(即rhs),b1的作用域并不在func内部,不存在析构。构造函数的调用是发生在func的return语句上,func返回的是值类型,这里调用拷贝构造函数以b1(即rhs)为参数生成一个临时的B类型对象,这个临时对象在完成给b2的赋值(调用赋值运算符)后被析构(调用析构函数)。

  • 我呀 看书吃饭等下班 2015/12/07

    都别猜了,看《C++反汇编与逆向分析技术揭秘》。

  • ブ矿泉水的味道 程序猿 2015/12/07

    1L正解,很详细的。

    D选项是对的。

  • 小牙 在读硕士 2015/12/07

    我感觉应该是选A,其中第9行是声明加定义,定义是调用的默认构造函数,两个类类型变量,所以两次构造函数,第10行是赋值,所以调用一次赋值运算符,函数调用了一次拷贝构造,一次析构,拷贝构造和析构来自func函数的临时对象。

    一楼的应该是把直接初始化 与 赋值弄混了。我在Linux下测试了一下,是对的。

    • 小牙 在读硕士 2015/12/07

      我看题目了,是第10行发生的,第10行是依次是一次拷贝,一次赋值运算符,一次析构

    • TWang LISP爱好者 2015/12/16

      问题是第十行 哈哈。 我想问一下 为什么数据在第十行就出局了?

  • kanglq   2015/12/07

    编译不过,什么都不会发生

  • TWang LISP爱好者 2015/12/16

    我汉语不太好,看不懂ABCD 但是一行一行分析
    #9 : default ctor
    #10:
    #6: cpy ctor
    #10: operator=
    #11: dtor
    cpy : 拷贝
    ctor: 构造函数?
    dtor: 就是~Name() 那东西