2

なぜ最初のコンストラクターを呼び出すのかについて、次のプログラムについて混乱しています。

class A  
{  
public:  
        A(const char *c="\0")  
        {  
                cout<<"Constructor without arg";  
        }  
        A(string c)  
        {  
                cout<<"New one";  
        }  

};  

int main()  
{  
        A a="AMD";  
        return 0;  
}  

出力は Constructor without arg

4

3 に答える 3

8

"AMD"はでありconst char[]、暗黙的にに変換されるconst char*ため、最初のコンストラクター[ A(const char *c="\0")]が最適です。

A(const char *c="\0")は引数のないコンストラクターではなく、引数として単一を取り、 aが指定されconst char*ていない場合に使用するオプションのデフォルト値を持つコンストラクターであることに注意してくださいconst char*。この場合、を渡すconst char*ので、それを使用します。

于 2012-09-20T16:08:09.327 に答える
1

文字列リテラルはconst char[]暗黙的に変換する型であるためconst char*、ユーザー定義の変換よりも優先されます(これは実際にはコンストラクターstd::string(const char*)の署名ではありませんが、この説明には十分です)。string

また、初期化は割り当てではありません。operator=これが、そもそもコンストラクターではなくコンストラクターが呼び出される理由です。

C++11での割り当てに推奨される構文はですA a{"ASDF"};。それは物事をより均一にします。

于 2012-09-20T16:08:52.293 に答える
0

const char *を使用してコンストラクターを呼び出しているのは、それが「AMD」であるためです。文字列ではありません。A a(string( "AMD"))を入力すると、機能します。

于 2012-09-20T16:08:44.397 に答える