Я провел небольшое исследование, но не смог найти объяснения поведения моего кода (возможно, я задаю неправильные вопросы). Я работаю на C ++, использую VS2019.
Код относится к классу Points
из учебника по структурам данных и другим объектам.
Мой класс в том виде, в каком он существует сейчас:
class point {
private:
double x;
double y;
public:
//constructors
point(double ix = 0.0, double iy = 0.0) {
x = ix;
y = iy;
}
point(const point &z) {
x = z.getX();
y = z.getY();
cout << "copy constructor triggered" << endl;
cout << x << "," << y << endl;
}
//assignment
void operator = (const point& result) {
x = result.getX();
y = result.getY();
cout << "assignment overload triggered" << endl;
cout << x << "," << y << endl;
}
//getters
double getX() const {
return x;
}
double getY() const{
return y;
}
//setters
void setX(double newX) {
x = newX;
}
void setY(double newY) {
y = newY;
} //other function members are omitted
}//end point() class
point operator + (const point& A, const point& B) { //Adds x1 to x2, y1 to y2
point n;
n.setX(A.getX()+ B.getX());
n.setY(A.getY()+ B.getY());
return n;
}
Проблема впервые возникла, когда я обнаружил, что не могу создать экземпляр класса в той же строке, что и пытался добавить два экземпляра, используя оператор + перегрузка.
point p1(5, 3);
point p2(12, 9);
point p3 = p1 + p2; //gives the following error: class "point" has no suitable copy constructor
Я обнаружил, что сделал ошибку, забыв включить «const» в свой конструктор копирования. Решив эту проблему с помощью конструктора копирования, я смог заставить код работать достаточно хорошо, чтобы отправить свое задание, но я не был удовлетворен своим пониманием.
В процессе решения этой проблемы я бы также добавлена перегрузка оператора присваивания (=) внутри определения класса. Выполнив некоторую отладку консоли, я обнаружил странный образец:
point p1(5, 3);
point p2(12, 9);
point p3;
p3 = p1 + p2; //calls both copy constructor and assignment instructor
point p4 = p1 + p2; // calls only copy constructor
point p5;
p5 = p1; //calls only assignment operator
point p6 = p2; // calls only copy constructor
Итак, теперь мне интересно , почему p3 = p1 + p2 вызывает и конструктор копирования, и перегрузку присваивания. Вызывает ли компилятор конструктор копирования при добавлении точек? Я не думал, что это будет так, поскольку перегрузка operator+
создает временную точку с конструктором по умолчанию, затем вручную изменяет значения с помощью геттеров и сеттеров, а затем возвращает эту временную точку. Насколько я понимаю, конструктор копирования должен вызываться только при создании нового объекта , а p3
- нет.
Я также должен сказать, что мы еще не обсуждали использование указателей с классами /objects.
Любая помощь здесь приветствуется. Заранее благодарим за любую помощь.