浅谈静态成员
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.静态成员函数是类的一部分,而不是对象的一部分。如果在类外要调用公有的静态成员函数,一般按照如下的格式:类名::静态成员函数()
以上是关于浅谈静态成员的主要内容,如果未能解决你的问题,请参考以下文章