Это допустимо, потому что 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;
};
Теперь конструктор не будет учитываться при выполнении неявных преобразований, и приведенный выше код вызовет ошибку.