1

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

#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::string 仍然有效还是被删除了?(在对象本身)

4

3 回答 3

6

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

因此,当您在构造函数的初始化列表(通过: mStr(str))中对其进行初始化时,通过引用传递的参数将被复制。在您的示例中,只有初始化会导致制作副本:如果您删除了初始化,则不会制作任何副本。

于 2012-07-07T19:04:49.183 回答
3

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

于 2012-07-07T19:04:36.920 回答
3

你是对的,除了你错过了 mStr(str) 复制 str 的事实。该副本在 ~Somthing(); 中被销毁;

于 2012-07-07T19:04:59.093 回答