C++第三次作业

类的静态成员


静态数据成员

在类中,如果某个属性为整个类所共有的,不属于任何一个具体对象,则采用**static**关键字来声明为静态成员。静态成员只有一个副本,由所有该类的对象共同维护和使用,从而实现了同一类不同对象之间的数据共享。**类属性是描述类的所有对象特征的一个数据项,对应任何对象实例,它的属性值还是相同的**。
例如,使用Point类,其数据成员count用于统计Point类的对象个数,如果不使用static静态数据成员,如下:
#include <iostream>

using namespace std;

class Point
{
private:
	int x, y;
	int count = 0;//未使用static

public:
	Point(int X, int Y)
	{
		x = X;
		y = Y;
                count++;
	}//构造函数
	Point(Point& p)
	{
		x = p.x;
		y = p.y;
		count++;
	}

	~Point() { count--; }

	int getX() { return x; }
	int getY() { return y; }

	void displayCount()
	{
		cout << "count = " << count << endl;
	}
};

int main()
{
	Point a(4, 5);
	cout << "Point a : " << a.getX() << " and " << a.getY() << endl;
	a.displayCount();
	Point b(1, 2);
	cout << "Point b : " << b.getX() << " and " << b.getY() << endl;
	b.displayCount();
	
	return 0;
}
  • 预期结果:
    Point a : 4 and 5
    count = 1
    Point b : 1 and 2
    count = 2

  • 但实际结果是:

  • 如果给count加上static,使其成为静态数据成员,如下:

#include <iostream>

using namespace std;

class Point
{
private:
	int x, y;
	static int count;//使用static

public:
	Point(int X, int Y)
	{
		x = X;
		y = Y;
		count++;
	}//构造函数
	Point(Point& p)
	{
		x = p.x;
		y = p.y;
		count++;
	}//复制构造函数

	~Point() { count--; }

	int getX() { return x; }
	int getY() { return y; }

	void displayCount()
	{
		cout << "count = " << count << endl;
	}
};
int Point::count = 0;

int main()
{
	Point a(4, 5);
	cout << "Point a : " << a.getX() << " and " << a.getY() << endl;
	a.displayCount();
	Point b(1, 2);
	cout << "Point b : " << b.getX() << " and " << b.getY() << endl;
	b.displayCount();
	
	return 0;
}

结果为:

静态函数成员

静态函数可以直接访问该类的静态数据和函数成员,而不必通过对象名。访问非静态成员,必须通过对象名。一般情况下主要用来访问同一类的静态数据成员,维护对象之间共享的数据。
上面的程序可以改写为:
#include <iostream>

using namespace std;

class Point
{
private:
	int x, y;
	static int count;//使用static

public:
	Point(int X, int Y)
	{
		x = X;
		y = Y;
		count++;
	}//构造函数
	Point(Point& p)
	{
		x = p.x;
		y = p.y;
		count++;
	}//复制构造函数

	~Point() { count--; }

	int getX() { return x; }
	int getY() { return y; }

	static void displayCount()//静态函数成员
	{
		cout << "count = " << count << endl;
	}
};
int Point::count = 0;

int main()
{
	Point a(2, 7);
	cout << "Point a : " << a.getX() << " and " << a.getY() << endl;
	Point::displayCount();//未通过对象名调用函数
	Point b(4, 9);
	cout << "Point b : " << b.getX() << " and " << b.getY() << endl;
	Point::displayCount();//未通过对象名调用函数
	
	return 0;
}

结果同之前一样:

posted @ 2019-09-28 20:10  PrinzViolet  阅读(122)  评论(0编辑  收藏  举报