簡體   English   中英

c + +我應該使用const作為參數值類型的方法嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM