静态成员

为了实现一个类的多个对象之间的数据共享,C++提出了静态成员的概念。

静态成员包括:

静态数据成员和静态成员函数

静态成员的作用:

1.静态成员不属于某一个对象,而属于一个类(属于所有对象),无论建立多少个对象,都共享静态成员——是连接各个对象的桥梁。
2.静态数据成员主要用于各个对象共用数据。如:总数的统计、平均数等。

静态数据成员的定义:

static 数据类型 数据成员名;

class student
{
private:
	int num;
	char* name;
	static float score;
};

静态数据成员可以初始化,但只能在类外进行

格式: 数据类型  类名::静态数据成员 = 初值;

说明:
1)静态数据成员可以说明为公有的、私有的或保护的,说明为公有的可直接通过类名来访问。
        类名 ::静态成员名
2)私有或保护静态数据成员只能通过公有成员函数访问。
3)静态成员不同于全局变量——封装在类内部,使用静态数据成员取代全局变量,使数据更为安全;

结论:当在类中需要共享某一数据成员时应定义为静态数据成员。

#include<iostream>
using namespace std;

class box
{
public:
	int width; int length;
	static int height;
	box(int w, int l);
	int volume();
};
int box::height = 10;
box::box(int w, int l)
{
	width = w;
	length = l;
}
int box::volume()
{
	return width * length * height;
}
int main()
{
	box a(10, 20), b(20, 30);
	cout << a.height << endl;
	cout << b.height << endl;
	cout << a.volume() << endl;
	cout << b.volume() << endl;
	return 0;
}

静态数据成员的存储:
在所有对象之外单独开辟空间存储,只要在类中定义了静态数据成员,即使不定义任何对象,也为静态数据成员分配空间,它可以在尚未建立对象时通过类名引用。

在类中使用静态数据成员后,只要某一个对象改变了其值整个类的对象相应的静态数据成员的值均改变。

有效解决办法:

静态成员函数——访问静态数据成员

静态成员函数的定义:
static  返回类型  函数名(参数列表);

        { };
如: static float averge( )
     {return (sum/3) ;}

静态成员函数的调用:
1)静态成员函数属于一个类,可用类名调用。

         格式:   类名 :: 静态成员函数名(实参表);

2)静态成员可以用对象调用。

格式 : 对象名 静态成员函数名(实参表);

说明:
1)静态成员函数可以在类内部定义,也可在类外定义。

如:类中声明: static float averge();
类外定义:  float student::averge( )
                  {return (sum/3); }
2)静态成员函数无this指针(this指针属于某一对象,静态成员属于令个类),主要用来访问静态数据成员,不能直接访问非静态数据成员,如果要访问非静态数据成员,需加上对象名。

3)普通成员函数可以调用静态成员函数;

4)构造函数和析构函数不能是静态的。
结论:当在类中定义有静态数据成员时,通常应定义静态成员函数来访问静态数据成员。

#include<iostream>
using namespace std;

class student
{
public:
	student(int n,string m,float s):num(n),name(m),score(s){}
	void total();
	static float averge();
private:
	int num;
	string name;
	float score;
	static float sum;
};
float student::sum = 0;
void student::total() { sum += score; }
float student::averge() { return (sum / 3); }
int main()
{
	student stu[3] = {student(1,"zhangsan",89),student(2,"lisi",85),student(3,"wangwu",75)};
	for (int i = 0; i < 3; ++i)
	{
		stu[i].total();
	}
	cout << "averge=" << student::averge() << endl;
	return 0;
}


 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值