#c #class #constructor
Вопрос:
Я просматривал книгу под названием » Принципы и методы программирования с использованием C «, но обнаружил странное поведение построения классов. Предположим, у меня есть следующий класс:
class Foo {
public:
Foo(int x)
: y { x } { }
private:
int y;
};
и у меня есть другой класс, у которого есть экземпляр класса Foo в качестве объекта-члена
class Bar {
public:
Bar(Foo x)
: y { x } { }
private:
Foo y;
};
Когда я делаю следующее:
int main()
{
Bar obj_1 { Foo { 1 } };
Bar obj_2 { 2021 }; // this doesn't give me error?
return 0;
}
obj_1 был построен, как указано в конструкторе, но obj_2 не выдает мне никакого сообщения об ошибке, и мне кажется, что это просто волшебным образом работает.
Мое намерение иметь члена класса в качестве экземпляра другого класса состояло в том, чтобы заставить конструктор принимать экземпляр класса в качестве аргумента, но не целое число.
Почему он не выдает мне ошибку неправильного типа?
Комментарии:
1. Волшебство: Я умный. Ему нужен а
Foo
, но он получил аint
и знает, как превратить аint
в аFoo
.
Ответ №1:
Вы можете предотвратить это неявное преобразование, объявив Foo
конструктор explicit
explicit Foo(int x) : y { x } { }
в main
этом случае потребуется, чтобы вызывающий объект изменил свой obj_2
экземпляр на
Bar obj_2 { Foo{2021} };
Комментарии:
1. Или Bar(int)=удалить; чтобы просто предотвратить построение бара из int.