2016-04-21 31 views
0

在函數聲明和定義可能與參數的常量不一致時偶然發現。我發現了一些信息(下面的鏈接),但我的問題是爲什麼常量匹配是按值參數可選的,但是常量匹配是否需要參考參數?函數參數:常量匹配聲明和定義

請考慮以下代碼here

class MyClass 
{ 
    int X; 
    int Y; 
    int Z; 

public: 
    void DoSomething(int z, int y, const int& x); 
    int SomethingElse(const int x); 
    void Another(int& x); 
    void YetAnother(const int& z); 
}; 

void MyClass::DoSomething(int z, const int y, const int& x) // const added on 2nd param 
{ 
    Z = z; 
    Y = y; 
    X = x; 
} 

int MyClass::SomethingElse(int x) // const removed from param 
{ 
    X = x; 
    x = 3; 
    return x; 
} 

void MyClass::Another(int& x) // const not allowed on param 
{ 
    X = x; 
} 

void MyClass::YetAnother(const int& z) // const required on param 
{ 
    Z = z; 
} 

我找到了this on SO,但它正在尋找對名稱的修改的解釋。我還發現了this on SOthis on SO,但他們沒有詳細說明爲什麼const參數需要參考參數。

+0

不匹配被討論[這裏](http://stackoverflow.com/q/20659000/1460794)。 – wally

+1

這不是一個重複的問題。我沒有發現一個關於常量的問題,關於價值和借鑑,以及爲什麼**有一個區別。儘管[this](http://stackoverflow.com/questions/117293/use-of-const-for-function-parameters)有一個確實包含了引用的答案,但它不是很明顯,因爲問題在於by-價值,它不回答**爲什麼**有差異。 – bamakid

回答

1

當您通過值傳遞時,參數實際上是函數的局部變量。無論你傳遞什麼,都被複制。如果參數是const T,則意味着函數本身不能修改自己的變量。來電者不應該知道或關心這一點。

通過const T&實際上是指訪問一個不屬於該函數的變量。與const T*相同。但與T* const不一樣,那隻意味着函數本身不能修改它自己的指針。指針屬於函數,如果函數想要重新指派它指向其他自己的業務。它指向的內容不屬於該函數,因此該函數是否獲取const訪問權限與調用方非常相關。

1

對於數值參數,const實際上沒有區別。如果參數作爲值傳遞,它無論如何都不能被函數修改。

1

如果一個參數是按值傳遞的,但標記爲const,如果該變量確實被修改會發生什麼?該函數的本地副本會改變,但傳入的副本不會。

但是,另一方面,如果通過引用傳遞,如果你可以以某種方式修改該變量,它將操縱原來的而不僅僅是一個副本。