我正在寻求澄清当一个返回对具有该对象的返回类型的函数中的对象的引用时究竟发生了什么。
考虑以下功能:
CObject getObject() {
CObject localObject;
CObject &objectRef(localObject);
return objectRef;
}
据我了解,此函数将返回“localObject”的副本,而不是返回对“localObject”的引用。它是否正确?它本质上是使用localObject作为构造函数参数创建和返回一个新对象吗? 例如,
CObject newObject(localObject);
答案 0 :(得分:6)
它将返回对象的副本。但是,如果更改函数声明以返回引用,请务必小心,否则您的代码将导致未定义的行为。
示例:强>
php > $tables = array(0 => array('date' => '06/01/2016 - 06/30/2016', 0 => array(1, 34, 2, 55), 1 => array(2, 55, 55, 100), 2 => array(3, 60, 100, 500)));
php > foreach ($tables as $table)
php > {
php { foreach ($table as $index => $tier)
php { {
php { if (!is_numeric($index))
php { continue;
php {
php { echo $tier[0]."<br>";
php { echo $tier[1]."<br>";
php { echo $tier[2]."<br>";
php { echo $tier[3]."<br>";
php { }
php { }
1<br>34<br>2<br>55<br>2<br>55<br>55<br>100<br>3<br>60<br>100<br>500<br>
php >
这将导致:
cosntructing 复制
注意:如果编译器由于RVO而完全优化代码,则可能无法获得相同的结果。所以关闭所有优化并尝试。 正如@Caduchon所说,即使没有优化,结果也会因拷贝缺失而改变。
未定义行为的功能示例:
class CObject{
public:
CObject(){std::cout << "cosntructing ";}
CObject(const CObject& other){std::cout << "copying ";}
};
CObject getObject(){
CObject localObject;
CObject &objectRef(localObject);
return objectRef;
}
int main(){
auto result = getObject();
}
答案 1 :(得分:1)
你没有返回对本地对象的引用是正确的。就实际返回的内容而言,答案更为微妙。由于名为return value optimisation的东西,编译器实际上只会在调用函数时创建一个server = XMLRPC::Client.new2("http://rpc.technorati.com/rpc/ping")
result = server.call("weblogUpdates.ping", "Copenhagen.rb", "http://www.copenhagenrb.dk/")
puts server.http_last_response.body
实例。这是一个优化技巧,基本上意味着原始CObject
的构造方式可以被调用函数直接使用 - 因此在返回调用时不需要复制构造。