2012-07-07 169 views
0

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

#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仍然有效或被删除? (在对象本身中)

+0

复制:':mStr(str)' – 2012-07-07 19:02:23

+0

要正确测试该行为,您应该使用非std :: string,但应该使用您自己编写的类的对象。你正在测试std :: string,而不是现在的行为! – 2012-07-07 19:05:25

回答

5

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

因此,当您在构造函数的初始化列表(通过: mStr(str))初始化它时,通过引用传递的参数是复制。在你的例子中,只有初始化会产生一个副本:如果你删除了初始化,那么不会创建副本。

+0

在构造函数体中赋值是否会导致复制? – Brian 2012-07-07 19:20:39

2

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

3

你是对的,除非你错过了mStr(str)复制str的事实。这个副本在〜Somthing()中被销毁。