C++ 复制构造函数';我不打电话,为什么?
可能重复:C++ 复制构造函数';我不打电话,为什么?,c++,C++,可能重复: 我有以下代码: #include <iostream> #include <new> using namespace std; class test { int *p; public: test operator=(test a); test() { p = new int [2]; cout <<"Default Constructor was done here." <
我有以下代码:
#include <iostream>
#include <new>
using namespace std;
class test {
int *p;
public:
test operator=(test a);
test() {
p = new int [2];
cout <<"Default Constructor was done here." << "\n";
}
test(const test &a) {
p = new int [2];
this->p[0] = a.p[0];
this->p[1] = a.p[1];
cout << "Copy Constructor was done here." << "\n";
}
~test() {
delete p;
cout << "Destructor was done here." << "\n";
}
int set (int a, int b) {
p[0] = a;
p[1] = b;
return 1;
}
int show () {
cout << p[0] << " " << p[1] << "\n";
return 2;
}
};
test test::operator=(test a) {
p[0] = a.p[0];
p[1] = a.p[1];
cout << "Operator = was done here" << "\n";
return *this;
}
test f(test x) {
x.set(100, 100);
return x;
}
int main () {
test first;
test second;
first.set(12, 12);
//f(first);
//second = first;
second = f(first);
first.show();
second.show();
getchar ();
return 0;
}
#包括
#包括
使用名称空间std;
类测试{
int*p;
公众:
测试运算符=(测试a);
测试(){
p=新整数[2];
cout这可能是的影响。编译器可以自由地避免复制不会对程序造成影响的对象。在这种情况下,复制构造函数/析构函数的副作用不被视为对程序的影响。一般来说,它将避免复制一个临时变量用作函数参数,因为临时变量将被删除不管怎么说,她后来死了
这可以在标准的§12.8.32中找到:
当满足某些条件时,允许实现省略
类对象的复制/移动构造,即使复制/移动
在这种情况下,对象的构造函数和/或析构函数具有副作用
在某些情况下,实现将处理省略的源和目标
复制/移动操作只是引用
同一个对象,该对象的销毁发生在
这两个物体在没有
优化。这省略了复制/移动
在以下情况下,允许执行名为copyelision的操作
情况(可能结合使用以消除多个副本):
- 在具有类返回类型的函数中的return语句中,当表达式是具有
与函数返回类型相同的cv不合格类型,
复制/移动操作可以通过构造自动
对象直接输入函数的返回值
- 在抛出表达式中,当操作数是作用域未超出范围的非易失性自动对象的名称时
最里面的封闭try块(如果有)的结尾
从操作数到异常对象的复制/移动操作(15.1)
可以通过将自动对象直接构造到
异常对象
- 当未绑定到引用(12.2)的临时类对象将被复制/移动到类对象时
相同的cv不合格类型,复制/移动操作可以通过
将临时对象直接构建到目标中
省略复制/移动
- 当异常处理程序(第15条)的异常声明声明与
对于异常对象(15.1),可以省略复制/移动操作
将异常声明作为异常的别名处理
对象,除非
执行由声明的对象的构造函数和析构函数
异常声明
在这种情况下,它很可能只是使用f
返回的对象作为操作符=
的输入,因为它是临时的,因此无论如何都会在之后被销毁。复制省略,大量重复项…输出是不可观察的行为吗?允许编译器删除副本,即使它们有副作用。@BoBT是的,但答案是错误的。“编译器可以自由地避免在不影响程序的地方复制对象”-这部分是错误的。编译器可以自由地避免在不影响程序的地方复制任何对象。正如jrok和Luchian指出的,这是复制的一个特例。