C++对象构造函数通过常量引用复制传递

C++ object constructor pass by const reference copying

本文关键字:引用 复制 常量 对象 构造函数 C++      更新时间:2023-10-16

当我将一个对象作为常量引用传递给另一个对象时,是否进行了复制?我一直认为,由于我通过引用传入对象,成员对象本身实际上是我传入的对象,而不是副本。我制作了一个测试程序,使传入的引用对象在作用域结束时被销毁,但它并没有像我预期的那样崩溃。这是一个等待发生的错误,还是对象正在被复制?

#include <iostream>
#include <string>
class Something
{
public:
    Something(const std::string& str) : mStr(str) {}
    const std::string& str() const
    {
        return mStr;
    }
private:
    std::string mStr;
};
int main()
{
    Something* something;
    {
        std::string temp = "Testing.";
        something = new Something(temp);
    }
    std::cout<<something->str()<<"n";
    delete something;
    return 0;
}

这个std::字符串仍然有效还是被删除了?(在对象本身中)

数据成员mStr的类型为std::string(它是一个对象,而不是引用)。

因此,当您在构造函数的初始化列表中初始化它时(通过: mStr(str)),通过引用传递的参数是复制的。在您的示例中,只有初始化才会生成副本:如果删除初始化,则不会生成副本。

temp变量的内容被复制到mStr。代码有效。

你是对的,只是你错过了mStr(str)制作str副本的事实。这个副本在~Somthing()中被销毁;