c++中的复制构造函数和临时对象

copy constructor and temporary object in c++

本文关键字:临时对象 构造函数 复制 c++      更新时间:2023-10-16

我已经定义了一个类:

    构造函数
  1. 析构函数
  2. 拷贝构造函数
  3. 赋值操作符
  4. operator +(Class& obj)添加两个对象。

operator+按值返回如下:

Base operator +(Base& obj2)
{ 
    cout<<"+ operator calledn"; 
    Base tmp;
    tmp.x=x+obj2.x;
    tmp.y=y+obj2.y;
    return tmp;
}

如果在main函数中我创建了三个对象。应该有三个析构函数调用:

Base obj1(1,2);
Base obj2(1,2);
Base obj3=obj1+obj2; 

问题:

  1. operator +()的主体中,而return tmp;我看到它调用了我的复制构造函数。是这种tmp类型的Base被存储在编译器内部生成的临时对象中(例如Base compiler_tmp=tmp),因此调用复制构造函数?

  2. 如果是,那么我认为它应该代表表达式obj3=obj1+obj2;的RHS,并且应该在该语句的末尾调用析构函数。

我以上的假设正确吗?还是我漏掉了一点?

这个问题有两个方面。有语义复制构造、真实复制构造和移动构造(你没有定义)。从语义上讲,在函数执行过程中调用了以下复制构造函数:

  • 返回tmp;从你的tmp
  • 复制-在'函数返回空间'(无论它是什么)中构造一个对象
  • obj3中的temporary = is copy-construct from object in function return space
  • obj3是从临时
  • 复制构建的

现在,复制-省略技术开始发挥作用。根据您的编译器,您可能有任意数量的未调用的复制构造函数。

  1. 是的。operator+调用复制构造函数,因为您返回了Base的新实例。