c++ - 按值返回不创建新对象

标签 c++

<分区>

我想尝试一下我读到的关于在 C++ 中按值返回的内容(它与在创建新对象时按值传递相同)我有这样的代码:

#include <iostream>

using namespace std;

class Kar{

public:
    int n;
    static int no;

    Kar(){
        n = ++Kar::no;
        cout << "Creating Kar " << n << endl;
    }

    Kar(Kar &k){
        n = ++Kar::no;
        cout << "Copying Kar " <<k.n<< " to new Kar " << n << endl;
    }

    ~Kar(){
        cout << "Destroying Kar "<< n << endl;
    }

    Kar& operator= (const Kar &k);
};


Kar& Kar::operator= (const Kar &k){

    cout << "Assigning Kar "<< k.n <<" to Kar "<< this->n << endl;
    return *this;
}



int Kar::no;

Kar foo(){
    cout << "Starting foo()" << endl;
    Kar k;
    cout << "Finishing foo()" << endl;
    return k;
}


int main(int argc, char **argv) {
    cout << "Starting!" << endl;

    Kar k;
    k=foo();
    //     Kar k2 = foo();

    cout << "Finishing!" << endl;
    return 0;
}

终端输出是这样的:

Starting!
Creating Kar 1
Starting foo()
Creating Kar 2
Finishing foo()
Assigning Kar 2 to Kar 1
Destroying Kar 2
Finishing!
Destroying Kar 1
  1. 我希望 foo() 中的行为是:a. 创建 Kar 2 b. 将其复制到 Kar 3 并返回它(随后将 Kar 3 分配给 Kar 1)。为什么不呢?

  2. 如果我取消注释 Kar k2 = foo(); 我会收到编译器消息:

    错误:没有匹配函数调用 Kar::Kar(Kar)

当然结束了,我不能添加构造函数 Kar(Kar k){ } 因为那是无效的。这是什么意思?为什么构造函数 Kar(Kar &k) 不用于这种情况?

最佳答案

您看到的行为称为 return value optimization .因此,编译器不会为返回值创建一个临时对象,而是会消除它,并使用在 return 语句之后已经创建的对象。

关于你的第二个问题,你得到了一个编译器错误,因为你不能将非 const 临时变量(右值)绑定(bind)到左值引用(顺便说一句,MSVC 接受这个,但这是一个非标准行为)。尝试将您的复制构造函数更改为:

Kar(const Kar& kar);

关于c++ - 按值返回不创建新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21362755/

相关文章:

c++ - stdafx.h 的用途

c++ - base64 减少编码十进制数所需的数字

c++ - 套接字通过send()发送的tcp数据包慢

c++ - 在 pkg-config 搜索路径中找不到包 webkitgtk-3.0

c++ - 具有负值的模运算符

c++ - 使用 C++ 从 .dll 调用带有默认参数的函数

java - 将 .mm 文件转换为 java 可读形式

c++ - 使用不可复制值类型进行 boost::fusion::map 初始化的生成器

c++ - 如何在opencv cpp中获取霍夫变换矩阵,霍夫变换的theta和rho值

c++ - co_await 运算符实际上做了什么?