关于构造函数和运算符的一些基本问题

时间:2017-11-01 02:48:26

标签: c++ constructor operators

很抱歉,如果这个问题听起来太基础了,但我想知道这段代码中究竟发生了什么(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

我注意到了一些事情:

  1. 没有为c
  2. 调用构造函数 永远不会调用
  3. operator=(但是,如果我将赋值和实例声明放在不同的行中,则会调用operator=
  4. 我观察到的是预期的吗?如果是这样,为什么operator=从未被调用?

    P.S。我的operator +正在返回一个对象而不是一个引用(Point3d而不是Point3d&),我认为这是正确的吗?

2 个答案:

答案 0 :(得分:3)

  
      
  1. 没有为c
  2. 调用构造函数   

最有可能归因于Return Value Optimization

  
      
  1. operator=永远不会被称为
  2.   

因为所示的所有行都没有执行赋值,只有构造。在声明在同一语句中指定对象的行中使用=只是复制构造的“语法糖”。

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;