Явные и неявные конструкторы
class Test
{
public:
Test(int i) { cout<<"constructor called\n";}
Test(const Test& t) { cout<<" copy constructor called\n";}
};
class Test1
{
public:
Test1(int i) { cout<<"constructor called\n";}
explicit Test1(const Test1& t) { cout<<" copy constructor called\n";}
};
int main()
{
Test t(0);
Test u = 0;
//Test1 t1(0); Line 1
//Test1 u1 = 0; Line 2
}
Я наблюдаю разные выводы. Случай 1: Когда Строка 1 и Строка 2 прокомментированы, o/p is: constructor, называемый constructor, называется
Случай 2: когда строка 1 и строка 2 не закомментированы: тогда ошибка компиляции
Может кто-нибудь объяснить выводы и причину этого. Также кто-то может сказать, действительно ли в конечном итоге оператор = вызывает конструктор копирования или нет.
2 ответа
Ваша проблема заключается в этом явном конструкторе, плюс небольшое недопонимание инициализации объекта.
Согласно этому, выражение:
Type variableName = value;
Всегда будет выполнять копию инициализации такого объекта, это означает, что:
Test1 u1 = 0;
Будет эффективно вызывать перегруженный конструктор Test1::Test1(const Test1&)
с аргументом Test1(int)
в результате чего u1::Test1(Test1(0))
,
Кроме того, поскольку вы объявляете конструктор копирования явным, инициализация в стиле копирования завершится неудачно, но это:
Test1 t1(0);
Компилируется, потому что это выражение вызывает инициализацию направления, и даже если Test1(int) будет помечен как явный, прямая инициализация является явной, поэтому каждый фрагмент соответствует.
Тест u = 0 является случаем преобразования конструктора. Пожалуйста, обратитесь к Что такое конвертирующий конструктор в C++? Для чего это? для деталей.
Я попытался скомпилировать закомментированные строки после удаления комментария, и он скомпилирован для меня. Я использую GCC версии 4.3.4. Какую версию компилятора вы используете?