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

时间:2012-07-07 19:00:23

标签: c++ reference constructor copy const

当我将一个对象作为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是否仍然有效或被删除? (在对象本身中)

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

中销毁