2014-12-12 4 views
0

У меня есть следующие классыНе получать ожидаемое поведение с «явным» ключевым словом в C++

class abc 
{ 
private: 
    string name_; 
public: 
    explicit abc(string name); 
}; 

class xyz 
{ 
private: 
    abc obj_abc_; 
public: 
    xyz():obj_abc_("NOTHING") { }; //I think this should give an error since explicit is used. 
}; 

Согласно тому, что я понял о явном, я должен получать ошибку компиляции, когда АБВ конструктор который вызывается; потому что я инициализирую obj_abc, просто назначив его строке. Но я не получаю ошибку компилятора здесь. Что мне не хватает?

+0

'Явное abc (имя строки): name_ (name);' This compiled? – PaulMcKenzie

+0

@PaulMcKenzie Спасибо за исправление моей ошибки там –

ответ

2

explicit в конструкторе означает, что конструктор не может использоваться для преобразования из его типа параметра в тип класса. Таким образом, неявное преобразование

abc x = "NOTHING"; 

будет запрещен, если конструктор explicit, но не иначе. Явное преобразование

abc x("NOTHING"); 

будет разрешен в любом случае. В вашем случае прямая инициализация в списке инициализации является явной; поэтому для этого может использоваться ваш явный конструктор.

explicit не предотвращает неявные преобразования в тип параметра конструктора; поэтому преобразование с "NOTHING" в string в ваш пример разрешено в любом случае с использованием неявного конструктора string.

0

Помимо ошибки синтаксиса (используйте { } вместо ;), вы не назначаете или неявно преобразовываете что-либо. Вы явно создаете объект в списке инициализации.