Why is my overloaded C++ constructor not called?

I have a class like this one:

class Test{
public:
  Test(string value);
  Test(bool value);

};

If I create an object like this:

Test test("Just a test...");

The bool constructor is called!

Anyone knows why?

Thanks

10
задан Steve Guidi 6 August 2010 в 16:34
поделиться

6 ответов

Тип «Просто тест ...» - const char * , который можно неявно преобразовать в bool или std :: string . Поскольку std :: string не является встроенным типом, типы const char * преобразуются в bool . Вы можете предотвратить это, явно преобразовав const char * в std :: string :

Test test(std::string("Just a test..."));
18
ответ дан 3 December 2019 в 14:24
поделиться

Тип «Просто тест ...» - const char * . Существует встроенное преобразование указателей в bool , которое предпочтительнее, чем не встроенное преобразование из const char * в std :: string .

Причина, по которой предпочтительнее преобразование типа bool, состоит в том, что std :: string , хотя и является частью стандартной библиотеки, не является встроенным типом, таким как целые числа, указатели и логические значения. Он действует как любой другой класс, поэтому его конструкторы преобразования рассматриваются только после преобразований во встроенные типы.

4
ответ дан 3 December 2019 в 14:24
поделиться

Один из способов обойти эту проблему - предоставить другой конструктор, который принимает const char * и затем явно преобразует его в std :: string.

3
ответ дан 3 December 2019 в 14:24
поделиться

Один из способов - создать переменную типа std :: string и передать ее в:

std::string test = "TEST";
A a(test);

Таким образом, тип явно определяется как std :: string , он не будет по умолчанию конструктор, который принимает bool

0
ответ дан 3 December 2019 в 14:24
поделиться

Это колодец известное раздражение C ++.

Ваш строковый литерал имеет тип chat const []. У вас есть два конструктора, последовательности преобразования из char const [] в Test выглядят следующим образом:

1) char const [] -> char const * -> bool

2) char const [] -> char const * -> std :: string

1) - это встроенное стандартное преобразование, тогда как 2) - это преобразование, определяемое пользователем. Встроенные преобразования имеют приоритет над преобразованиями, определяемыми пользователем, поэтому ваш строковый литерал легче преобразовать в bool, чем в std :: string.

8
ответ дан 3 December 2019 в 14:24
поделиться

Когда у вас есть конструктор (особенно несколько конструкторов), который принимает только один аргумент, может оказаться целесообразным объявить их «явными», чтобы избежать подобных сюрпризов. Это заставляет пользователя класса удостовериться, что он задает правильный тип конструктору, который он хочет использовать, и предотвращает выполнение этих неявных преобразований типов за спиной пользователей и затрудняет поиск ошибок.

http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=15&rll=1

В C ++ 0x это было расширено до операторов преобразования, чтобы предотвратить ту же проблему

http://www2.research.att.com/~bs/C++0xFAQ.html#explicit-convertion

1
ответ дан 3 December 2019 в 14:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: