浅谈静态成员

        静态成员这个概念是在C++中首次提出的,它是为了解决一个或者多个成员为所有的对象共用问题。静态成员包括静态数据成员和静态成员函数,所以下面分别就两方面来介绍学习。

 一.静态数据成员

这里先来举一个例子来看看静态数据成员到底啥时候被使用(下面的这个为学生类)

<span style="font-size:18px;"><strong>#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
	Student(char *name1, char*number1, float score1);
	~Student();
	void show();
	void show_ave_score();
private:
	char *name;
	char *number;
	float score;
	int count;
	int sum;
	float ave;
};
Student::Student(char *name1, char*number1, float score1)
{
	name = new char[strlen(name1) + 1];
	strcpy(name, name1);
	number = new char[strlen(number1) + 1];
	strcpy(number, number1);
	score = score1;
	++count;
	sum += score;
	ave = sum / count;
}
Student::~Student()
{
	delete[]name;
	delete[]number;
}
void Student::show()
{
	cout << "name:" <<name<< endl;
	cout << "number:" << number<<endl;
	cout << "score:" << score<<endl;
}
void Student::show_ave_score()
{
	cout << "count:" << count << endl;
	cout << "sum:" << sum << endl;
	cout << "ave:" << ave << endl;
}
int main()
{
	Student stu1("lining", "12345", 90);
	stu1.show();
	stu1.show_ave_score();
	Student stu2("xiaoming", "2345", 80);
	stu2.show();
	stu2.show_ave_score();
	getchar();
	return 0;

}</strong></span>


        在这个例子中,sum,count,ave都不能定义为普通成员函数,所以不能被多个成员共同使用,那么怎么来解决这个问题呢?当然就是使用我们的静态数据成员来解决喽!

        在一个类中,若将一个数据成员说明为static,这种成员就被称为静态数据成员,无论建立多少个类的对象,都只有一个静态数据成员的拷贝,从而实现了同一个不同对象之间的数据共享。定义静态数据成员的格式为:static 数据类型 数据成员名;

那么上面的程序就可以改为:

<span style="font-size:18px;"><strong>#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
	Student(char *name1, char*number1, float score1);
	~Student();
	void show();
	void show_ave_score();
private:
	char *name;
	char *number;
	float score;
	static  int count;
	static int sum;
	static float ave;
};
Student::Student(char *name1, char*number1, float score1)
{
	name = new char[strlen(name1) + 1];
	strcpy(name, name1);
	number = new char[strlen(number1) + 1];
	strcpy(number, number1);
	score = score1;
	++count;
	sum += score;
	ave = sum / count;
}
Student::~Student()
{
	delete[]name;
	delete[]number;
}
void Student::show()
{
	cout << "name:" << name << endl;
	cout << "number:" << number << endl;
	cout << "score:" << score << endl;
}
void Student::show_ave_score()
{
	cout << "count:" << count << endl;
	cout << "sum:" << sum << endl;
	cout << "ave:" << ave << endl;
}
int Student::count = 0;
int  Student::sum = 0;
float Student::ave = 0.0;
int main()
{
	Student stu1("lining", "12345", 90);
	stu1.show();
	stu1.show_ave_score();
	Student stu2("xiaoming", "2345", 80);
	stu2.show();
	stu2.show_ave_score();
	getchar();
	return 0;

}</strong></span>

注意:

(1)声明静态数据成员是在类的函数里,但必须在类外对其初始化。一般是在main()函数之前,类声明之后的特殊地为它提供定义和初始化。初始化的格式如下:数据类型 类名::静态数据成员=初始值;

(2)静态数据成员属于类,而一般的数据成员属于某一对象,所以可以使用“类名::静态数据成员”的方法访问直接访问静态数据成员

(3)用对象访问静态数据成员的方法:对象.静态数据成员     或者  对象指针->静态数据成员

二.静态成员函数

在类定义中,前面有static说明的成员函数称为静态成员函数,它属于整个类,是该类所有对象共享的成员函数,而不属于勒种的某个对象。静态成员函数是为了来处理静态数据成员的。定义静态成员函数的格式为:

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

调用公有静态成员函数的一般格式为:

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

对象.静态成员函数名(实参表)

对象指针->静态成员函数(实参表)

一般而言,静态成员函数不访问类中的非静态数据成员,如果确实需要访问,那么静态成员函数只能通过对象名(或者对象指针、对象引用)访问该对象的非静态成员。

下面就是一个静态成员访问非静态数据成员的例子:

<span style="font-size:18px;"><strong>#include<iostream>
using namespace std;
class small_cat
{
public:
	small_cat(double w);
	static void display(small_cat& w)
	{
		cout <<"weight:"<< w.weight << endl;
	}
	static void total_disp()
	{
		cout <<"total_number:"<< total_number << endl;
		cout << "total_weight:"<<total_weight << endl;
	}
private:
	double weight;
	static double total_weight;
	static double total_number;
};
small_cat::small_cat(double w)
{
	weight = w;
	total_weight += w;
	total_number++;
}
double small_cat::total_number = 0.0;
double small_cat::total_weight = 0.0;
int main()
{
	small_cat ss(0.9), bb(0.8), vv(0.7);
	small_cat::display(ss);
	small_cat::display(bb);
	small_cat::display(vv);
	small_cat::total_disp();
	getchar();
	return 0;
}</strong></span>


很明显,我们使用静态成员函数访问到了非静态成员。

好啦!以上大致就是静态数据成员和静态成员函数的使用场合。最后再补充几点知识点:

1.静态成员函数与非静态成员函数的区别就是:非静态成员函数有this指针,但静态成员函数无

2.静态成员函数可以直接访问本类中的静态数据成员,因为静态数据成员同样是属于类的,可以直接访问。当它与静态数据成员一块使用的时候,达到了对同一个类中对象之间共享数据的目的。

3.私有静态成员不能被类外部的函数和对象访问。

4.使用静态成员函数的一个原因是:可以用它在建立任何对象之前调用静态成员函数,以处理静态数据成员,这是普通成员函数所不能实现的功能。

5.编译系统将静态成员函数限定为内部链接,也就是说,在除过包含此静态成员函数的文件外不能调用该函数。这样一来,维护了该函数使用的安全性。

6.静态成员函数是类的一部分,而不是对象的一部分。如果在类外要调用公有的静态成员函数,一般按照如下的格式:类名::静态成员函数()


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值