Как может быть присвоение от int к объекту в C ++?

0
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
    В C ++ предпочтительно не ставить void, если нет параметров. Также вы можете сделать свой номер получая постоянную функцию.
Теги:
constructor
variable-assignment
assignment-operator

1 ответ

6
Лучший ответ

Это законно, потому что С++ интерпретирует любой конструктор, который может быть вызван одним аргументом типа 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;
};

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

  • 2
    Я бы добавил примечание о том, что, хотя это поведение «действительно странно», оно позволяет писать func(std::string s); (или func(const std::string& s) ) и вызывать их как func("literal"); ,
  • 2
    @ Крис Лутц: Ты абсолютно прав. Под «действительно странным» я подразумевал «в этом контексте это действительно странно».

Ещё вопросы

Сообщество Overcoder
Наверх
Меню