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

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. Какую версию компилятора вы используете?

Другие вопросы по тегам