Построение объекта, отличного от заданных параметров, НЕ дает мне ошибок

#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.