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, произошла ошибка компиляции.
Итак, я думаю, что это связано с конструктором. Правильно ли это?
Пожалуйста, дайте мне хорошее объяснение.
Спасибо.
Это законно, потому что С++ интерпретирует любой конструктор, который может быть вызван одним аргументом типа 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;
};
Теперь конструктор не будет учитываться при выполнении неявных преобразований, и приведенный выше код вызовет ошибку.
func(std::string s);
(или func(const std::string& s)
) и вызывать их как func("literal");
,