c++中的复制构造函数和临时对象
copy constructor and temporary object in c++
我已经定义了一个类:
- 构造函数
- 析构函数
- 拷贝构造函数 赋值操作符
-
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;
问题:
在
operator +()
的主体中,而return tmp;
我看到它调用了我的复制构造函数。是这种tmp类型的Base被存储在编译器内部生成的临时对象中(例如Base compiler_tmp=tmp),因此调用复制构造函数?如果是,那么我认为它应该代表表达式
obj3=obj1+obj2;
的RHS,并且应该在该语句的末尾调用析构函数。
我以上的假设正确吗?还是我漏掉了一点?
这个问题有两个方面。有语义复制构造、真实复制构造和移动构造(你没有定义)。从语义上讲,在函数执行过程中调用了以下复制构造函数:
- 返回tmp;从你的tmp 复制-在'函数返回空间'(无论它是什么)中构造一个对象
- obj3中的temporary = is copy-construct from object in function return space
- obj3是从临时 复制构建的
现在,复制-省略技术开始发挥作用。根据您的编译器,您可能有任意数量的未调用的复制构造函数。
-
是的。
operator+
调用复制构造函数,因为您返回了Base
的新实例。 -
。
相关文章:
- 类中的 Arduino 对象构造函数设置垃圾值
- 编译错误:临时对象构造函数中缺少参数
- 双指针在使用 new 时不调用对象构造函数
- 以支持继承的方式将自身shared_ptr添加到对象构造函数中的向量中
- 在创建对象向量时,不为每个对象唯一调用默认对象构造函数
- GCC __attribute__((constructor)) 在对象构造函数之前调用
- 自定义对象构造函数在循环外部循环
- 从全局对象构造函数停止监视器计时器
- 如何防止使用临时调用构造函数
- Arduino 上的 Sketch 停止在对象构造函数中执行
- C++临时对象成员函数的生存期
- 通过在引用线程对象来传递取消引用的“this”指针来在函数对象构造函数中创建线程是好是坏
- 为什么当对象构造函数投入新表达式时,为什么不调用DealLocation函数
- 临时结构对象构造函数奇数调用
- 未显式引用对象的全局对象构造函数在最终二进制文件 - LD 中被丢弃
- 为什么 Clang++ 不在另一个静态库中运行全局对象构造函数?
- 在未加载上下文的情况下在对象构造函数中使用OpenGL函数
- 为什么我们需要一个用户提供的const对象构造函数
- 对象构造函数的C++数组
- 以临时对象为参数的C++对象构造函数