![](/img/trans.png)
[英]C++ template function for method with a parameter of a const type or simply of type
[英]c++ should I use const to method of parameter value type?
我有這個例子:
void SetWidth(double width);
應該是:
void SetWidth(const double width);
不,你不應該。
編譯器將這兩個函數簽名視為相同,因此在這種情況下,如果誤導讀者,則可以通過添加const
來完成幾乎所有操作。 舉一個顯而易見的例子,一個不太了解C ++的讀者可能會相信同時擁有這兩個條件:
void SetWidth(double) {}
void SetWdith(const double) {}
...將是合法的函數重載。 當然,這是錯誤的-如前所述,編譯器將兩者視為相同,因此這只會違反一個定義規則。
const
確實會阻止您修改函數內部的參數,但是如果函數足夠大以至於您認為自己需要此參數(即,您難以跟蹤正在修改的內容和未修改的內容),那么很有可能還不錯,您需要重寫該函數。
從呼叫者的角度來看,兩者是等效的。 您可以(並且為了減少噪音,應該)將該const
保留在聲明之外,而僅將其包括在定義中。
從實現者的角度來看,出於與可能希望任何局部變量不變的相同原因,您可能想要這樣做:確保它不會偶然更改。
簡短的答案:實現一個函數,當需要確保(或明確表示)以下內容時, 該函數將按值接受const
參數: “此參數在該函數體內不會改變”。
並實現一個函數,當您要顯式告訴調用者時, 該函數將按引用接受const
參數: “此函數不會更改傳遞給它的參數。”
(如果“ setter”按值接受參數-例如SetWidth
使用const
並沒有多大意義)
它們幾乎相等。
唯一的區別是您告訴編譯器使用const
時不能在函數范圍內修改變量width
。
對於,Void SetWidth(double width);
我們可以使用SetWidth()函數來更改可變寬度的值。 但是,更改的值不會反映回調用的函數。 說,
class A_Class
{
public:
void SetWidth(double width) {
width=width+10;
this._width=width;
std::cout<<"IN SetWidth:"<<width;
}
private:
double _width;
};
int main()
{
A_Class aObj;
double twidth=20.9;
aObj.SetWidth(twidth);
std::cout<<"twidth:"<<twidth;
return 0;
}
O/P: IN SetWidth:30.9
twidth:20.9
因此,將其設置為const並沒有關系,您已經在其他原型類型[void SetWidth(const double width);]中提到過。
在內部,編譯器為堆棧中的“ width”變量分配內存,並將值復制到該變量。 如果使用第二個原型類型[void SetWidth(const double width);],則可確保在函數內部不能更改可變寬度為常數。
希望這可以幫助。
如果不希望函數修改局部變量的width
,則應將其聲明為const
。 這樣,如果您無意間嘗試分配給變量,或將其地址分配給非const指針(因為這可能會導致對其進行修改),則編譯器將發出警告。
兩種情況下生成的代碼都沒有區別,只是啟用了這些附加的安全檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.