C++ does=当声明变量与复制构造函数c++;?

C++ does=当声明变量与复制构造函数c++;?,c++,class,copy-constructor,C++,Class,Copy Constructor,我上课的时候, 并主要声明: time a; time b=a; 这是否等同于: time b(a); ??? 我还提出了以下功能: time f(time t) { return t; } 并在声明了以下内容后在main中使用它: time b=f(a); 我在调用copy构造函数时打印了消息,结果只有两次调用copy构造函数,一次是将a复制到t,另一次是复制t返回,我的问题是没有调用copy构造函数将函数返回的值复制到b 提前谢谢 否,b=a使用赋值操作符(operator=)创

我上课的时候, 并主要声明:

time a;
time b=a;
这是否等同于:

time b(a);
??? 我还提出了以下功能:

time f(time t)
{
  return t;
}
并在声明了以下内容后在main中使用它:

time b=f(a);
我在调用copy构造函数时打印了消息,结果只有两次调用copy构造函数,一次是将a复制到t,另一次是复制t返回,我的问题是没有调用copy构造函数将函数返回的值复制到b


提前谢谢

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

通常,您会发现编译器生成的版本会调用复制构造函数,但它不必这样做

作为参考,请查找关键字。由于复制对象有两种方式(复制构造函数和赋值操作符),这告诉编译器仅在显式调用时使用复制构造函数,而不是隐式调用


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

标题中的问题和文章底部的问题是不同的。对于标题中的内容:

do=当声明变量与复制构造器C++ +

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


对于您的另一个问题,这是。

是的,
时间b=a
相当于时间b(a),因为您同时声明对象并分配其值


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

当从另一个对象创建对象时,副本构造函数称为

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

但当对象已创建且您希望将项目复制到该对象时,则运算符= 被称为

区别就如同使用动态分配的内存一样 如果您使用复制构造函数,这意味着您尚未创建,因此不需要对内存管理进行任何清理


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

很容易看出你是否添加了一些跟踪cout@AndersK我这样做了,这就是为什么我问了最后一个问题答案似乎返回了选项化!这是错误的。当用于初始化时,
=
不是
操作符=
。因为我们现在有了C++11:如果调用
操作符=
,它不会移动
a
,而是将其复制到
b
。重要的区别。