Почему мне разрешено инициализировать объект класса Test, назначая целочисленную константу в C ++? - PullRequest
2 голосов
/ 07 августа 2020

Вот мой код на C ++

#include<iostream>

class Test{
        int i;
public:
        Test() { }
        Test(int i){ 
                std::cout << "Constructor called" << std::endl;
                this->i = i;
        }
        void print(){
                std::cout << i << std::endl;
        }
};

int main(){
        Test t = 3;
        t.print();
        return 0;
}

Меня забавляло, когда Test t = 3; работал. Я не понимаю, почему он не дает ошибки компиляции.

У меня сложилось впечатление, что объект класса Test должен быть создан одним из следующих способов. Существуют ли другие способы создания объекта класса Test, не описанные в следующем списке?

Test t1;
Test t2(2);
Test t3 = Test(3);
Test t4(t3);
Test t5 = Test(t4);
Test t6{2};
Test t7 = Test{3};
Test t8{t3};
Test t9 = Test{t4};
Test t10 = {10};

1 Ответ

4 голосов
/ 07 августа 2020

Этот синтаксис:

Test t = 3;

является формой инициализации копирования . Результатом этого является то, что для инициализации t выбирается лучшая определяемая пользователем последовательность преобразования. В этом конкретном случае вы предоставили конструктор преобразования Test(int), который является наиболее подходящим и вызывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...