Явные и неявные конструкторы

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:
конструктор называется
конструктор называется

Случай 2: когда строка 1 и строка 2 не закомментированы: тогда ошибка компиляции

Может кто-нибудь объяснить выводы и причину этого. Также кто-то может сказать, действительно ли в конечном итоге оператор = вызывает конструктор копирования или нет.

0

Решение

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

В соответствии с этот, выражение:

Type variableName = value;

Будет всегда выполнять копия инициализация такого объекта, это означает, что:

Test1 u1 = 0;

Будет эффективно вызывать перегруженный конструктор Test1::Test1(const Test1&)с аргументом Test1(int)в результате чего u1::Test1(Test1(0)),

И, во главе, потому что вы объявляете конструктор копирования как явный, инициализация в стиле копирования не удастся, но это:

Test1 t1(0);

Компилируется, потому что это выражение вызывает инициализацию направления, и даже если Test1 (целое) будет помечен как явный, прямая инициализация является явной, поэтому каждый кусок соответствует.

3

Другие решения

Тест u = 0 является случаем преобразования конструктора. Пожалуйста, обратитесь к Что такое конвертирующий конструктор в C ++? Для чего это? для деталей.
Я попытался скомпилировать закомментированные строки после удаления комментария, и он скомпилирован для меня. Я использую GCC версии 4.3.4. Какую версию компилятора вы используете?

0

По вопросам рекламы [email protected]