浅谈静态成员

Posted 梅诺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈静态成员相关的知识,希望对你有一定的参考价值。

        静态成员这个概念是在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.静态成员函数是类的一部分,而不是对象的一部分。如果在类外要调用公有的静态成员函数,一般按照如下的格式:类名::静态成员函数()


以上是关于浅谈静态成员的主要内容,如果未能解决你的问题,请参考以下文章

浅谈Static

浅谈Java中的内部类

浅谈移动Web开发(上):深入概念

浅谈C++类中的static

浅谈java类中成员的初始化顺序

浅谈集合与引用