C++语法06-静态成员

1. 静态数据成员

为了实现同一个类的多个对象之间的数据共享,C++提出了静态数据成员的概念。在一个类中 ,若将一个数据成员说明成static,这种成员被称为静态数据成员。与一般的数据成员不同,无论建立多少个类的对象,都只有一个静态数据成员的拷贝。从而实现了同一个类中的不同对象之间的数据共享。

定义静态数据成员的格式如下:

static 数据类型 数据成员名

说明:

(1)静态数据成员的定义与普通数据成员相似,但前面要加上static关键字。

(2)静态数据成员的初始化与普通数据成员不同。静态数据成员初始化应在类外单独进行,而且应在定义对象之前进行。一般在主函数main之前,类声明之后的特殊地带为它提供定义和初始化。

1
2
初始化的格式如下:
数据类型 类名::静态数据成员名=初始值;

(3)静态数据成员属于类(准确地说,是属于类对象的集合),而不像普通数据成员那样属于某一对象,因此可以使用使用“类名:”访问静态的数据成员。

1
2
用类名访问静态数据成员的格式如下:
类名:静态数据成员名

(4)静态数据成员与静态变量一样,是在编译时创建并初始化。它在该类的任何对象被建立之前就存在。因此,公有的静态数据成员可以在对象定义之前被访问。对象定义后,公有的静态数据成员,也可以通过对象进行访问。

1
2
对象名.静态数据成员名;
对象指针->静态数据成员名;

(5)私有静态数据成员不能在类外直接访问,必须通过公有的成员函数访问。

(6)C++支持静态数据成员的一个重要原因是可以不必使用全局变量。依赖于全局变量的类几乎都是违反面向对象程序设计的封装特性的。静态数据成员主要用作类的所有对象所共有的数据,如统计总数、平均数等。

2. 静态成员函数

在类定义中,前面有static说明的成员函数被称为静态成员函数。静态成员函数属于整个类,是该类所有对象共享的成员函数,而不是类中的某个对象。

1
2
3
4
5
6
7
定义静态成员函数的格式如下:
static 返回类型 静态成员函数名(参数表);

与静态数据成员类似,调用公有静态成员函数的一般格式有如下几种:
(1) 类名::静态成员函数名(实参名)
(2) 对象.静态成员函数名(实参名)
(3) 对象指针->静态成员函数名(实参名)

例:静态成员函数访问静态数据成员。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<iostream>
using namespace std;
class Small_cat{
public:
Small_cat(double w);
static void total_disp();
private:
double weight;
static double total_weight;
static double total_number;
};
Small_cat::Small_cat(double w){
weight=w;
total_weight+=w;
total_number++;
}
void Small_cat::display(){
cout<<"这只小猫的重量是:"<<weight<<"千克\n";
}
void Small_cat::total_disp(){
cout<<total_number<<"只小猫的总重量是:"
cout<<total_weight<<"千克"<<endl;
}
double Small_cat::total_weight = 0;
double Small_cat::total_number = 0;
int main(){
Small_cat w1(0.5),w2(0.6),w3(0.4);
w1.display();
w2.display();
w3.display();
Samll_cat::total_disp();

return 0;
}

下面对静态成员函数的使用再作几点说明:

(1)一般情况下,静态函数成员主要用来访问静态数据成员。当它与静态数据成员一起使用时,达到了对同一个类中对象之间共享数据的目的。

(2)私有静态成员函数不能做类外部的函数和对象访问。

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

1
2
3
4
5
6
int main(){
Small_cat::total_disp(); //可以用它在建立任何对象之前调用静态成员函数
Small_cat w1(0.5),w2(0.6),w3(0.4);
...
return 0;
}

(4)编译系统将静态成员函数限定为内部连接,也就是说,与现行文件相连接的其他文件中的同名函数不会与该函数发生冲突,维护了该函数使用的安全性,这是使用静态成员函数的另一个原因。

(5)静态成员函数是类的一部分,而不是对象的一部分。

(6)静态成员函数与非静态成员函数的重要的区别是:非静态成员函数有this指针,而静态成员函数没有this指针。静态成员函数可以直接访问本类中的静态数据成员,因为静态数据成员同样是属于类的,可以直接访问。一般而言,静态成员函数不访问类中的非静态成员。若确实需要访问非静态数据成员,静态成员函数只能通过对象名(或对象指针、对象引用)访问该对象的非静态成员。

-------------The End-------------
0%