作者holymars ()
看板C_and_CPP
标题Re: [问题] reference 问题
时间Wed Sep 16 22:20:54 2009
※ 引述《QQ29 (我爱阿蓉)》之铭言:
: 谢谢l大的解释但是还有一些地方不解 请教各位
: : const string& s = string("hello");
: : 由 string("hello") 产生的暂时物件,生命周期和 s 相同。
: 那为什麽 或是有什麽必要性 必须要使用ref=temp ref这种写法呢?
当你需要动态多型的时侯..
class AAA {
public:
virtual foo();
}
class BBB : public AAA {
public:
virtual foo();
}
AAA& fake_a = BBB();
fake_a.foo(); // 呼叫的是BBB::foo()!!
: 如果我写
: const string s("hello"); 效率 或是 差别在哪?
答案是没差..
当然如果你像上面一样有多型的需求 多型呼叫本身就比一般呼叫还要花成本
: 我只知道ref可以减少一次copy 但是建构还是需要
: 所以跟直接初始物件
: 感觉这两者没有差别?????请强者解惑
: : string& foo(){
: : return string("hello");
: : // string("hello") 暂时物件在离开 foo() 後就会解构。
: : }
: : string& s = foo(); // s 指向垃圾
: 这边想请教各位是
: 我实际去测试一下 如果foo的return type是回传copy
: 也就是少加了& 他就不会马上跳出foo就将他解构
string s = foo();
其实没有产生一个temp object
string s();
s = foo();
这样就会产生一个temp object (foo()的回传值)
: 这和上面讲的const string& s = string("hello");
: 是同样道理嘛???
不是
: 最後就是~常常看到很多code很喜欢直接写
: return 暂时物件; 这和我先写 物件 temp(初始); return temp;
: 这哪种是好习惯?? 效率上我也是觉得没有差@@
有差 在没有NRV的compiler上前者比较快
: 谢谢
关於这两个问题的详细回答
因为好长我懒得打 自己去看inside the C++ object model
section 2.3
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.32.13.219
※ 编辑: holymars 来自: 114.32.13.219 (09/16 22:27)
1F:推 QQ29:谢谢 你提的动态多型 如果是物件一定要这样初始化嘛@@? 09/17 14:00
2F:推 QQ29:AAA& fake_a(BBB());写这样 连暂时物件也不建构耶@@好怪喔 09/17 14:03
3F:→ holymars:reference要初始化要透过 =吧 你写AAA& fake_a(); 09/17 15:19
4F:→ holymars:compiler应该不会理你这行code吧. 09/17 15:19
5F:推 QQ29:就算不加上&他还是不会建构BBB()耶 09/17 17:59