它不保證是壞的。但在這個特定情況下,它是不必要的。
在許多(或大多數)上下文中,引用是作爲僞裝指針來實現的。你的例子恰好是這些情況之一。假設函數沒有被內聯,參數b
將作爲指針在「引擎蓋下」實現。所以,你真正通過setA
在第一個版本中是指針到int
,即提供間接訪問您的參數值。在第二個版本中,您立即傳遞int
,即提供直接訪問您的參數值。
哪個更好,哪個更差?那麼,在許多情況下,指針的大小比int
大,這意味着第一個變體可能會傳遞更大量的數據。這可能被認爲是「不好的」,但是由於兩種數據類型通常都適合硬件字的大小,所以它可能沒有明顯的差別,特別是如果參數在CPU寄存器中傳遞的話。
此外,爲了讀b
是變相的指針,你必須取消引用函數內。從性能角度來看,這也是「不好的」。
這些是人們希望通過值傳遞任何小尺寸參數(小於或等於指針大小)的正式原因。對於參數或更大的尺寸,傳遞const引用變成一個更好的主意(假設你沒有明確要求副本)。
然而,在大多數情況下,一個功能簡單很可能會被內聯,這將完全消除兩個變體之間的差別,不管你使用的參數類型。
const
在第二個變體中是不必要的事情是一個不同的故事。 const
在第一個變體中有兩個重要用途:
1)它阻止您修改參數值,從而保護實際參數不被修改。如果引用不是const
,則可以修改引用參數,從而修改參數。
2)它允許你使用rvalues作爲參數,例如,致電some_obj.setA(5)
。沒有那個const
這樣的呼叫是不可能的。
在第二個版本中這兩個都不是問題。沒有必要保護修改後的實際參數,因爲參數是該參數的本地副本。不管你對參數做什麼,實際的參數都將保持不變。不管參數是否被聲明爲const
,您都可以使用rvalues作爲參數SetA
。
因此,人們通常不會對通過值傳遞的參數使用頂級const
限定符。但是,如果您確實聲明const
,它將阻止您修改函數內的本地b
。有些人確實喜歡這樣做,因爲它強制執行適度流行的「不要修改原始參數值」約定,因此有時可能會在參數聲明中看到頂級const
限定符。
來源
2013-07-12 16:08:50
AnT
「他們告訴我不要用在下面的示例參考。但是,爲什麼?」他們不是說爲什麼嗎?沒有解釋的理由,獲取代碼審查意見並不是很有用。你不能問他們爲什麼? –