重载运算符和静态成员变量的行为
overloading operators and behavior of static member variable
我正在运行以下代码,并期望输出窗口在程序结束时显示等于 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;
}
p3
是 p2
的副本,但您没有递增计数器的复制构造函数。
您需要一个带有++counter
的Point(const Point&)
(除了复制x
和y
成员(。
假设你期望程序打印,点数是3,你实际上错过了几件事:
- 首先,您尚未声明复制或移动构造函数,因此编译器将为您生成一个默认构造函数。当您创建
p3
时,将调用该默认计数器,并且该默认计数器不会增加计数器。复制构造函数类似于Point(const Point&) { ++counter; }
. - 重载的运算符实际上是自己创建副本的。因此,如果添加复制构造函数,指针计数很可能为 4 或 5,而不是 3。若要更改此设置,应将两个运算符的返回类型从
Point
更改为Point&
。这样,这些运算符将返回同一对象的引用而不是它的副本 - 这意味着,不会创建任何副本,因此不会在每个运算符的末尾调用复制构造函数,而是仅当您实际创建副本(如p3
(。
您需要添加一个复制构造函数。
Point(const Point &p)
: x(p.x),
y(p.y)
{
++count;
}
相关文章:
- C++:是否可以使用非静态成员变量模板?
- 如何在复杂继承中访问静态成员变量
- 静态成员变量不会由 gettext 转换
- 未使用的C++未优化的静态成员函数/变量
- 为什么我不能像这样在静态成员函数中调用静态成员变量?
- C++ lambda - 捕获静态成员变量
- 多线程处理中的静态成员变量
- 纯标头库中静态成员变量的正确设置器和 getter
- 如何从具有专用化的类模板定义静态成员变量?
- 从静态成员函数访问私有非静态类变量 - C++
- 静态变量与静态成员
- 为什么可以在没有实例变量的情况下访问静态回调方法中的静态成员变量?
- 声明和定义类静态成员变量不会导致多重声明,这是为什么?
- 为什么不允许静态成员变量的初始化在类中,而允许静态静态成员的初始化
- 类中的静态成员变量和C++中的全局变量有什么区别?
- 获取 constexpr 全局变量(不是静态成员)的链接器符号
- C++ 静态成员变量 - 文件之间的访问
- 将非静态成员函数C 的使用无效,而将成员功能作为函数变量
- 如何在运行时使用静态成员函数初始化静态成员变量
- 如何在类静态成员中引用静态变量?