很抱歉,如果这个问题听起来太基础了,但我想知道这段代码中究竟发生了什么(Point3d
是我自己的实现):
int main()
{
Point3d a(1,2,3);
Point3d b(11,12,13);
Point3d c = a+b;
Point3d d = a;
Point3d e;
return 0;
}
因此在运行上面的代码之后,按以下顺序调用函数:
Point3d (const float x, const float y, const float z) // a
Point3d (const float x, const float y, const float z) // b
Point3d () //since I created a new object in operator+
operator+ (const Point3d& rhs) //a+b
Point3d (const Point3d& rhs) //the copy constructor for d = a
Point3d () //e
我注意到了一些事情:
operator=
(但是,如果我将赋值和实例声明放在不同的行中,则会调用operator=
)我观察到的是预期的吗?如果是这样,为什么operator=
从未被调用?
P.S。我的operator +正在返回一个对象而不是一个引用(Point3d而不是Point3d&),我认为这是正确的吗?
答案 0 :(得分:3)
- 没有为
调用构造函数 醇>c
最有可能归因于Return Value Optimization。
- 醇>
operator=
永远不会被称为
因为所示的所有行都没有执行赋值,只有构造。在声明和在同一语句中指定对象的行中使用=
只是复制构造的“语法糖”。
Point3d c = a+b; // aka: Point3d c(a+b);
Point3d d = a; // aka: Point3d d(a);
但是,如果我将赋值和实例声明放在不同的行中,则调用
operator=
是的,如果单独的语句(不是行)用于声明和赋值,则使用operator=
。
答案 1 :(得分:0)
因此,复制构造函数和赋值运算符之间存在差异。 您调用复制构造函数的实例:
object a = b
您调用赋值运算符的实例:
object a;
object b;
a = b;