重载运算符和静态成员变量的行为

overloading operators and behavior of static member variable

本文关键字:变量 静态成员 运算符 重载      更新时间:2023-10-16

我正在运行以下代码,并期望输出窗口在程序结束时显示等于 3 的点数。点 p3 存在一些问题,我在其中创建新点并在使用增量运算符后使用 p2 初始化。我不明白出了什么问题。这里肯定缺少一些东西。需要帮助!

感谢您的阅读。

#include <iostream>
using namespace std;
class Point {
    private:
        int x, y;
        static int  count;
    public:
    Point(): x(0), y(0) { count++; }
    Point(int x1, int y1) {
        x = x1; y = y1;
        count++;
    }
    int getCount() const { return count; }
    Point operator=(Point &p) {
        x = p.x;
        y = p.y;
        return *this;
    }
    Point operator++() {
        x++; y++;
        return *this;
    }
    void print() { cout << "(" << x << ", " << y << ")" << endl; }
};
int Point::count = 0;
//================ Driver Program ============
int main() {
    Point p1;
    Point p2(1, 1);
    p1.print();
    p2.print();
    Point p3 = ++p2;
    p3.print();
    cout << "Number of points: "<<p1.getCount() << endl;
    system("pause");
    return 0;
}

p3p2 的副本,但您没有递增计数器的复制构造函数。

您需要一个带有++counterPoint(const Point&)(除了复制xy成员(。

假设你期望程序打印,点数是3,你实际上错过了几件事:

  • 首先,您尚未声明复制或移动构造函数,因此编译器将为您生成一个默认构造函数。当您创建p3时,将调用该默认计数器,并且该默认计数器不会增加计数器。复制构造函数类似于 Point(const Point&) { ++counter; } .
  • 重载的运算符实际上是自己创建副本的。因此,如果添加复制构造函数,指针计数很可能为 4 或 5,而不是 3。若要更改此设置,应将两个运算符的返回类型从 Point 更改为 Point& 。这样,这些运算符将返回同一对象的引用而不是它的副本 - 这意味着,不会创建任何副本,因此不会在每个运算符的末尾调用复制构造函数,而是仅当您实际创建副本(如p3(。

您需要添加一个复制构造函数。

Point(const Point &p)
: x(p.x),
  y(p.y)
{
    ++count;
}