2016-04-21 14 views
0

関数の宣言と定義がパラメータの定数に一致しない場合があります。私はいくつかの情報(次のリンク)を見つけましたが、私の質問はなぜconstでバイナリパラメータのオプションマッチングですが、constマッチングは参照パラメータに必要ですか?関数のパラメータ:const matching宣言と定義

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

これは重複する質問ではありません。私は価値観と参考文献の両方に関するconstと、なぜ**の理由について違いがあるのか​​についての質問は見つかりませんでした。 [this](http://stackoverflow.com/questions/117293/use-of-const-for-function-parameters)には参照によってカバーされている回答がありますが、それは質問が副次的なものであることから明らかではありませんでしたが、 **なぜ**違いがありますか? – bamakid

答えて

1

引数を渡すと、引数は実質的に関数のローカル変数になります。あなたが渡したものは何でもコピーされます。引数がconst Tの場合、関数自体が独自の変数を変更できないことを意味します。呼び出し元は、そのことを知らないでください。

実際には、const T&を渡すことは、関数に属さない変数へのアクセスを指します。 const T*と同じです。しかし、T* constと同じではなく、関数自体が独自のポインタを変更できないことを意味します。関数がそれ自身のビジネスである別のものを指し示すようにポインタを再割り当てしたい場合、ポインタは関数に属します。それが指しているのは関数に属していないので、関数がconstにアクセスするかどうかは、呼び出し側にとって非常に重要です。

1

値パラメータの場合、constは実際には違いがありません。パラメータが値として渡された場合、それは関数によって変更することはできません。

1

引数が値渡しでconstとしてマークされている場合、変数が変更された場合はどうなりますか?関数のローカルコピーは変更されますが、渡されたコピーはコピーされません。

しかし、参照渡しの場合は、何らかの形で変数を変更できれば、コピーだけでなくオリジナルを操作します。