Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 复制构造函数';我不打电话,为什么?_C++ - Fatal编程技术网

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指出的,这是复制的一个特例。