このサンプルプログラムは、ローカル変数、グローバル変数、または匿名変数のどちらを渡すかによって、異なるコンストラクタがどのように呼び出されるかを示しています。ここで何が起こっているのですか?C++奇妙なことをする匿名のコンストラクタ
std::string globalStr;
class aClass{
public:
aClass(std::string s){
std::cout << "1-arg constructor" << std::endl;
}
aClass(){
std::cout << "default constructor" << std::endl;
}
void puke(){
std::cout << "puke" << std::endl;
}
};
int main(int argc, char ** argv){
std::string localStr;
//aClass(localStr); //this line does not compile
aClass(globalStr); //prints "default constructor"
aClass(""); //prints "1-arg constructor"
aClass(std::string("")); //also prints "1-arg constructor"
globalStr.puke(); //compiles, even though std::string cant puke.
}
は私がaClass(globalStr);
を呼び出すことによって、それがグローバルglobalStr
の代わりに使用されているタイプaClass
のglobalStr
という名前のローカル変数を作成していることを推測している、globalStr.puke()
を呼び出すことができることを考えます。 aClass(localStr);
を呼び出すと同じことが試みられますが、localStr
は既にstd::string
と宣言されているため、コンパイルに失敗します。 1-argコンストラクタを非定数式で呼び出すことで、クラスの匿名インスタンスを作成することは可能ですか?誰がが、variableName
という名前の変数を定義するのに許容される方法であるべきだと決めたのですか?
_anonymousコンストラクタとは何ですか?私が知っていることはありません。 –
[これは興味深い](http://ideone.com/eNXYvI)、なぜ 'pud()'が 'std :: string'クラスで呼び出されるのですか? –
@πάνταῥεῖ、 'main'の' globalStr'の宣言によって隠されています。 – chris