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

时间:2018-02-04 02:45:27

标签: c++

我正在运行以下代码并期望输出窗口在程序结束时应显示等于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;
}

3 个答案:

答案 0 :(得分:2)

string RawToken = Parser.Parse.ParseLineIntoToken(curlinecont); p3的副本,但您没有使计数器递增的复制构造函数。

您需要p2 Point(const Point&)(除了复制++counterx成员)。

答案 1 :(得分:1)

假设您期望该程序打印出点数为3,那么您实际上缺少了几件事:

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

答案 2 :(得分:0)

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

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