通过const引用复制传递C++对象构造函数
问题描述:
当我将对象作为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仍然有效或被删除? (在对象本身中)
答
数据成员mStr
类型std::string
(它是一个对象,而不是参考)。
因此,当您在构造函数的初始化列表(通过: mStr(str)
)初始化它时,通过引用传递的参数是复制。在你的例子中,只有初始化会产生一个副本:如果你删除了初始化,那么不会创建副本。
+0
在构造函数体中赋值是否会导致复制? – Brian 2012-07-07 19:20:39
答
temp
变量的内容被复制到mStr
。该代码是有效的。
答
你是对的,除非你错过了mStr(str)复制str的事实。这个副本在〜Somthing()中被销毁。
复制:':mStr(str)' – 2012-07-07 19:02:23
要正确测试该行为,您应该使用非std :: string,但应该使用您自己编写的类的对象。你正在测试std :: string,而不是现在的行为! – 2012-07-07 19:05:25