これを理解するには、ほとんどの場合const
、引数のaが呼び出しの曖昧さを解消するのに十分であることを理解する必要があります。
#include <iostream>
void foo(char* ptr)
{
std::cout << "mutable: " << ptr << std::endl;
}
void foo(const char* ptr)
{
std::cout << "const: " << ptr << std::endl;
}
int main()
{
const char* constHello = "hello";
char mutableHello[] = "hello";
foo(constHello);
foo(mutableHello);
}
これは印刷します:
const:hello
mutable:hello
コンパイラーは、可能な限り制限の少ないオーバーロードを選択します。したがって、過負荷があるchar*
ときにを使用するchar*
と、それが選択されます。しかし、存在しない場合、コンパイラーはそれをaにキャストすることがconst char*
実行可能な変換であると判断します(逆は明らかに真実ではありません)。
さて、非常に単純なことは、すべてのメソッドがthis
関数の最初のパラメーターとしてポインターを渡すことです。このパラメーターは、簡単にするために非表示になっています。メソッドのconst
最後にあるは、引数を修飾しthis
ます。これまで見てきたようconst
に、ポインタ上のaはオーバーロードを明確にするのに十分なので、これは効果的に機能します。