Как может быть присвоение от int до объекта в C ++? - PullRequest
0 голосов
/ 22 января 2011
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, произошла ошибка компиляции.
Итак, я думаю, что это связано с конструктором. Это верно?

Пожалуйста, дайте мне хорошее объяснение.
Спасибо.

1 Ответ

6 голосов
/ 22 января 2011

Это допустимо, потому что C ++ интерпретирует любой конструктор, который может быть вызван с единственным аргументом типа T, как средство неявного преобразования из T s в пользовательский тип объекта. В вашем случае код

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;
};

Теперь конструктор не будет учитываться при выполнении неявных преобразований, и приведенный выше код вызовет ошибку.

...