1

Здесь есть класс с двумя частными полями x и y;Инициализация объектов массива с помощью скобок в C++

class Point 
{ 
private: 
    int x, y; 
public: 
    Point(int = 1,int = 1); 
    void move(int, int); 
    void print() 
    { 
     cout << "X = " << x << ", Y = " << y << endl; 
    } 
}; 

При инициализации массива объектов Point, как показано ниже, выход в порядке;

Point array1[] = { (10), (20), { 30, 40 } }; 

Выход;

First array 
X = 10, Y = 1 
X = 20, Y = 1 
X = 30, Y = 40 

Однако, если мы инициализируем массив точек, как показано ниже, вывод является странным;

Point array2[] = { (10), (20), (30, 40) }; 

Выход;

Second array 
X = 10, Y = 1 
X = 20, Y = 1 
X = 40, Y = 1 

Почему (30,40) не работает для инициализации объекта Point?

Полный код испытания;

#include <iostream> 
using namespace std; 

class Point 
{ 
private: 
    int x, y; 
public: 
    Point(int = 1,int = 1); 
    void move(int, int); 
    void print() 
    { 
     cout << "X = " << x << ", Y = " << y << endl; 
    } 
}; 

Point::Point(int x, int y) 
{ 
    cout << "..::Two Parameter Constructor is invoked::..\n"; 
    this->x = x; 
    this->y = y; 
} 

void Point::move(int x, int y) 
{ 
    this->x = x; 
    this->y = y; 
} 

int main() 
{ 
    // Point array1[] = { Point(10), Point(20), Point(30, 40) }; 
    // Use parenthesis for object array initialization; 
    Point array1[] = { (10), (20), { 30, 40 } }; // curly bracket used for two parameter 
    Point array2[] = { (10), (20), (30, 40) };  // paranthesis used for all objects 

    cout << "First array" << endl; 
    for (int i = 0; i < 3; i++) 
     array1[i].print(); 

    cout << "Second array" << endl; 
    for (int i = 0; i < 3; i++) 
     array2[i].print(); 

    return 0; 
} 

И полный выход тестового кода;

..::Two Parameter Constructor is invoked::.. 
..::Two Parameter Constructor is invoked::.. 
..::Two Parameter Constructor is invoked::.. 
..::Two Parameter Constructor is invoked::.. 
..::Two Parameter Constructor is invoked::.. 
..::Two Parameter Constructor is invoked::.. 
First array 
X = 10, Y = 1 
X = 20, Y = 1 
X = 30, Y = 40 
Second array 
X = 10, Y = 1 
X = 20, Y = 1 
X = 40, Y = 1 
+4

Возможно потому, что он принимает '(30, 40)' как выражение с оператором запятой, оценивающей к единичному номер '40'. – owacoder

+0

@owacoder нет, возможно, об этом. это именно то, что происходит. –

ответ

5

Почему (30, 40) не работает:

о том, (30, 40) не то же самое, как с указанием {30, 40}, ни о том, (30) же с {30}.

(30, 40) представляет собой последовательность выражений (в данном случае интегральных литералов), разделенные comma operator, которое приводится к последнему выражению (то есть, 40). В то время как {30, 40} в контексте используется aggregate initialization list.

5

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

Обозначенные в инициализаторах массивы выражения в виде выражений, а не вызовы конструктора. Вы можете вызвать конструктор явно, чтобы удалить неоднозначность.

4

Parenathese в вашем коде вызывает у вас путаницу. Когда вы пишете (10), это не означает вызов конструктора с параметром 10.(10) становится 10, и вы можете зе, что с

Point array1[] = { 10, 20, { 30, 40 } }; 

Таким образом, для второго массива

(30, 40) 

Использует comma operator так

{ 10, 20, (30, 40) } 

Становится

{ 10, 20, 40 } 

Если вы хотите вызвать constrcutor два параметра, который вы должны будете кронштейну его, как и в первом примере или явно вызвать конструктор

{ 10, 20, Point(30, 40) } 

 Смежные вопросы

  • Нет связанных вопросов^_^