【问题标题】:does = when declaring a variable the same as copy constructor c++?= 声明变量时是否与复制构造函数 c++ 相同?
【发布时间】:2012-01-21 15:09:41
【问题描述】:

我安排了上课时间, 并在 main 中声明:

time a;
time b=a;

这是否与:

time b(a);

??? 我也做了函数:

time f(time t)
{
  return t;
}

并在声明 a 后在 main 中使用它:

time b=f(a);

我在调用复制构造函数时打印了消息,结果只有 2 次调用复制构造函数,一次将 a 复制到 t,另一个是将 t 复制到 return,这是我的问题,没有调用复制构造函数来复制值从函数返回到 b ?

提前致谢!

【问题讨论】:

  • 很容易看出是否在默认的ctor、copy ctor和赋值运算符中添加了一些跟踪cout
  • @AndersK 我做到了,这就是为什么我问最后一个问题答案似乎返回优化!

标签: c++ class copy-constructor


【解决方案1】:

标题中的问题和帖子底部的问题不同。对于标题中的那个:

在声明变量时是否与复制构造函数 c++ 相同?

不完全是。首先将右侧的表达式转换为左侧的类型,然后调用复制构造函数。这需要隐式转换。如果不可能,初始化将不会编译。如果右边的表达式已经是正确的类型,那么第一步就不需要了。

对于您的其他问题,这是return value optimization

【讨论】:

    【解决方案2】:

    是的,time b = a 等同于 time b( a ),因为您在声明对象的同时为其赋值。

    对于您问题的第二部分,编译器通常会根据优化级别尽可能删除不必要的对象副本。

    【讨论】:

      【解决方案3】:

      当一个对象从另一个对象被创建时,复制构造函数被调用

      时间 b = a; 或时间 b(a);

      但是当对象已经创建并且你想复制项目到它时,那么 operator= 被称为

      区别就像您使用动态分配的内存时一样 如果您使用复制构造函数,则意味着您尚未创建,因此您不需要清理内存管理

      但是当你将一个对象分配给另一个对象时,首先它必须处理自己动态分配的元素,比如释放内存,然后将它们复制到自己的

      【讨论】:

        【解决方案4】:

        不,b=a 使用赋值运算符 (operator=) 创建一个新的空白时间对象,然后调用该运算符将值移动到其中(或您告诉 operator= 执行的任何其他操作)。

        您通常会发现编译器生成的 this 版本会调用复制构造函数,但并非必须如此。

        作为参考,请查找 explicit 关键字。由于复制对象可以通过 2 种方式完成(复制 ctor 和赋值运算符),这告诉编译器仅在显式调用时使用复制 ctor,而不是隐式调用。

        使用所有不同的构造函数(包括新的 c++0x move one)和赋值运算符创建你的类,看看当你通过调试器运行它时会发生什么。

        【讨论】:

        • 这是错误的。用于初始化时,= 不是operator=
        • 既然我们现在有了 C++11:如果调用 operator=,它不会移动 a,而是将其复制到 b。重要区别。
        猜你喜欢
        • 2015-06-11
        • 2018-11-26
        • 1970-01-01
        • 2011-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多