2012-10-02 15 views
5

関数のオーバーロードは、同じ数のパラメータを持つ2つのメンバ関数の間で起こります。その1つがconstとして宣言されている場合です。constパラメータによる関数のオーバーロード

しかし、1つの関数にconst引数があり、別の関数が同じ型の非const引数を持つ場合はどうなりますか? 参照とポインタのために動作しますか? C++で提供されている場合、なぜそれが提供されますか?ご存知の場合は、その理由を私にお知らせください。

以下は、上記のシナリオを理解するのに役立つ例です。

void fun(const int i) 
{ 
    cout << "fun(const int) called "; 
} 
void fun(int i) 
{ 
    cout << "fun(int) called " ; 
} 
int main() 
{ 
    const int i = 10; 
    fun(i); 
    return 0; 
} 

出力:コンパイラエラー:redefinition of 'void fun(int)'

void fun(char *a) 
{ 
    cout<<"non-const fun() called"; 
} 

void fun(const char *a) 
{ 
    cout<<"const fun() called"; 
} 

int main() 
{ 
    const char *ptr = "GeeksforGeeks"; 
    fun(ptr); 
    return 0; 
} 

出力:秒1はCで許可されているのはなぜconstの楽しさは、()

と呼ば++?

+2

「void fun(char * const a)」を試してください – PiotrNycz

+0

私の答えにはまだ何かがありませんか?はいの場合は、私に教えてください、私はそれを改善することができます。 :)そうでなければ、私はそれを受け入れることを提案してもよいでしょうか? – Xeo

答えて

9

最初のパラメータは、トップレベルconstです。これは、関数がパラメータの値を変更できないことを意味しますが、呼び出し元は気にしません。呼び出し先はコピーのを取得するため、パラメータがの最上位constの場合は実装の詳細です。オーバーロードの第二のセットについて

void f(int); // forward declare 

void g(){ f(42); } 

void f(int const i){ /*...*/ } // define above declared function 

constがトップレベルはもうありません:以下の作品があることに注意してください。呼び出し先がのポインタの内容を変更できるかどうかを示します。です。発信者として、あなたはを実行します。はそれについて気にします。もう実装の詳細だけではありません。

+2

第3の関数とのペアは 'void fun(char * const a)'です。 – PiotrNycz

関連する問題