Агрегированный конструктор структуры - PullRequest
0 голосов
/ 17 июня 2019

У меня есть следующий код:

#include <iostream>
using namespace std;

struct Point {
    double x,y;
    Point(double x=0, double y=0): x(x), y(y) {}
};

struct Triangle {
    Point A,B,C;
    Triangle(Point A=Point(), Point B=Point(), Point C=Point()): A(A), B(B), C(C) {}
    void output()
    {
        cout<<"A: "<<A.x<<";"<<A.y<<endl;
        cout<<"B: "<<B.x<<";"<<B.y<<endl;
        cout<<"C: "<<C.x<<";"<<C.y<<endl;
    }
};

int main() {
    Triangle t;
    t.output();
    return 0;
}

Все отлично работает. Мой вопрос о конструкторе Triangle с параметрами по умолчанию. Является ли это правильным способом инициализации членов, вызывая конструктор Point, например, Point A=Point() (с точки зрения эффективности и чистого кода)?

Ответы [ 2 ]

2 голосов
/ 17 июня 2019

С точки зрения чистоты кода, я бы предпочел вместо этого представить два конструктора:

Triangle(Point inA, Point inB, Point inC): A(inA), B(inB), C(inC) {}
Triangle() : Triangle(Point(), Point(), Point()) {}
2 голосов
/ 17 июня 2019

Является ли это правильным способом инициализации членов путем вызова конструктора Point, подобного этому Point A = Point () (с точки зрения эффективности и чистого кода)?

Это правильно.

Вы не можете говорить об эффективности только одним методом. Вам нужно представить второй метод, а затем сравнить его по эффективности.

Что касается чистоты, я думаю, что лучше использовать имена аргументов функций, которые отличаются от переменных-членов.

Компилятор создаст правильный код при использовании

Triangle(Point A=Point(), Point B=Point(), Point C=Point()): A(A), B(B), C(C) {}

но его удобнее читать

Triangle(Point inA = Point(), Point inB = Point(), Point inC = Point()): A(inA), B(inB), C(inC) {}
...