Це називається конструктором, що перетворюється (або іноді неявний конструктор або неявне перетворення).
Мені невідомий перемикач часу компіляції, щоб попереджати, коли це відбувається, але це дуже легко запобігти; просто використовуйте explicit
ключове слово.
class Texture {
public:
explicit Texture(const std::string& imageFile);
};
Що стосується того, чи є хороша ідея перетворення конструкторів: Це залежить.
Обставини, в яких неявна конверсія має сенс:
- Клас досить дешевий, щоб побудувати, що вам все одно, якщо він неявно побудований.
- Деякі класи концептуально схожі на свої аргументи (наприклад, що
std::string
відображають те саме поняття, яке const char *
воно може неявно перетворити), тому неявна конверсія має сенс.
- Деякі класи стають набагато неприємнішими для використання, якщо неявна конверсія вимкнена. (Подумайте про необхідність явно викликати std :: string кожного разу, коли ви хочете передати рядковий літерал. Частини Boost схожі.)
Обставини, при яких неявна конверсія має менше сенсу:
- Будівництво дороге (наприклад, ваш приклад "Текстура", який вимагає завантаження та розбору графічного файлу).
- Заняття концептуально дуже відрізняються від своїх аргументів. Розглянемо, наприклад, контейнер, схожий на масив, який приймає його розмір як аргумент:
клас FlagList
{
FlagList (int Initial_size);
};
недійсні SetFlags (const FlagList & flag_list);
int main () {
// Тепер це компілюється, хоча це зовсім не очевидно
// що робить.
SetFlags (42);
}
- Будівництво може мати небажані побічні ефекти. Наприклад,
AnsiString
клас не повинен неявно будувати з а UnicodeString
, оскільки перетворення Unicode в ANSI може втратити інформацію.
Подальше читання: