3
class phone {  
    public:  
        phone(int x) { num = x; }
        int number(void) { return num; }
        void number(int x) { num = x; }

    private:
        int num;
};

int main(void)
{
    phone p1(10);

    p1 = 20;    // here!

    return 0;
}

こんにちは、みんな

上記のような単純なクラスを宣言しただけです。
その後、そのクラスのオブジェクトに int 値を割り当てたところ、うまくいきました!
(値を出力しました。適切に保存されていました)

int パラメータを持つコンストラクトがない場合、コンパイル エラーが発生しました。
だから、それはコンストラクターに関連していると思います。そうですか?

良い説明をお願いします。
ありがとう。

4

1 に答える 1

9

C++ は、型の 1 つの引数で呼び出すことができるコンストラクターを、 s からカスタム オブジェクト型Tに暗黙的に変換する手段として解釈するため、これは有効です。Tあなたの場合、コード

p1 = 20;

と解釈されます

p1.operator= (20);

これは、次のように解釈されます。

p1.operator= (phone(20));

この動作は非常に奇妙であり、ほぼ確実に望んでいたものではありません。無効にするには、コンストラクターをマークしexplicitて暗黙的な変換を無効にします。

class phone {  
    public:  
        explicit phone(int x) { num = x; }
        int number(void) { return num; }
        void number(int x) { num = x; }

    private:
        int num;
};

現在、暗黙的な変換を行うときにコンストラクターは考慮されず、上記のコードはエラーを引き起こします。

于 2011-01-22T08:55:23.247 に答える