список инициализации таблицы принимает значение int в пользовательском классе - PullRequest
1 голос
/ 14 февраля 2012

это мой короткий код

class A {
public:
    int x,y;
    A(int a=0, int b=0) {
        x=a;y=b;
    }
};
int main() {
    A t[2] = {9,3};
    cout << t[0].x << " " << t[0].y << endl;
    cout << t[1].x << " " << t[1].y << endl;
}

Вывод:

9 0
3 0

Когда я комментирую свой конструктор:

9 3
0 0

Мой вопрос: почемутот?Я пытался перегрузить все, что мог вычислить, это означает: конструктор копирования, конструктор с одним, двумя параметрами, (кома, равенство, []) операторы, но я не знаю, какой компилятор генерирует, что он может принимать 2 целых числа водин конструктор и назначить их х, у.Я даже пытался переполнить числа в скобках {}, поставив {99999999999999999999,3}, чтобы посмотреть, какой компилятор будет кричать, но он говорит, что не может преобразовать const int из-за переполнения, поэтому я считаю, что это должно быть преобразование, но как?

1 Ответ

1 голос
/ 14 февраля 2012

Вы неявно конвертируете 9 и 3 в A.

Небольшой тест докажет это:

class A {
public:
    int x,y;
    explicit A(int a=0, int b=0) {
        x=a;y=b;
    }
};

Это приведет к ошибке компиляции.

Это означает, что ваш код преобразуется в:

A t[2] = {A(9),A(3)};

Поскольку, закомментировав конструктор преобразования (давайте назовем его так, хотя я не уверен в этом), он больше не будетвозможность конвертировать int в A.

Второй фрагмент инициализирует только первый элемент.

РЕДАКТИРОВАТЬ: Чтобы уточнить, попробуйте следующий тест:

int x[10] = {1,1,1};

Это будет инициализировать только первые 3 элемента массива.

Также, без конструктора преобразования, попробуйте следующее:

A t[4] = {1,1,2,2};

Первые 2 A будутинициализируется.

...