Я искал ответы на этот вопрос в Интернете, но пока не нашел удовлетворительного ответа.Мне было интересно, каковы все правила для инициализации объектов структур и типов классов, особенно когда дело доходит до конструкторов против фигурных списков инициализаторов.Отличаются ли правила для структур и классов?
Предположим, у нас есть класс или структура с именем Rectangle
.
#include <iostream>
using namespace std;
class Rectangle {
public:
Rectangle() : x(5.0), y(6.0), width(7.0), height(8.0) {}
void printMe()
{
cout << "The rectangle is located at (" << x << ',' << y << ") and is " << width << " x " << height << endl;
}
double x;
double y;
double width;
double height;
};
int main()
{
Rectangle r = {0.0, 0.0, 3.0, 4.0};
r.printMe();
Rectangle s; // uninitialized!
s.printMe();
}
Я пытаюсь инициализировать Rectangle r
так, как вы бы это сделалиобычно делают это в C, используя простой старый скобочный список инициализатора.Однако g++
выдает следующую ошибку:
constructor_vs_initializer_list.cpp: In function ‘int main()’:
constructor_vs_initializer_list.cpp:21:38: error: could not convert ‘{0.0, 0.0, 3.0e+0, 4.0e+0}’ from ‘<brace-enclosed initializer list>’ to ‘Rectangle’
Rectangle r = {0.0, 0.0, 3.0, 4.0};
^
Хммм .... Это не очень полезное сообщение об ошибке, как кажется на первый взгляд.Однако я думаю, что это как-то связано с конструктором, потому что, если я его удалю, код компилируется и запускается!Я думаю, это было бы парадоксом, так как список фигурных инициализаторов и конструктор конкурируют за инициализацию элементов данных, которые ему кажутся.
Однако, когда я сделал элементы данных private
, после удаления конструктора, который является, то же сообщение об ошибке отображалось снова!
Интересно, каковы правила приоритета при инициализации членов данных.Как сопоставить список инициализаторов в скобках с конструктором, который вы определили сами?Как это соотносится с возможностями C ++ 11: = default
конструктор и инициализаторы членов класса?Я предполагаю, что эти разные способы инициализации элементов данных объекта каким-то образом конфликтуют друг с другом.
Rectangle() = default;
...
double x = 1.0;
Я не пишу, что их смешивание - это обязательно хороший код, простоэто код, и код, который должен быть хорошо понят по моему мнению.Спасибо.