写在前面
【目录】
为了实现一个类的一些成员与类本身相关,而不是与类的各个对象保持关联。这时候类的静态成员特性就可以派上用场。
在类的成员的声明之前加上关键字static就可以使其与类关联在一起。成员与其他的类成员一样,同样可以是public和private的。对于静态成员的类型可以是常量、引用、指针、类类型等。
注意几点:
(1)类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据。
(2)对于静态成员函数,其不与任何对象绑定在一起,即不包含this指针。所以,静态成员函数不能声明成const的,也不能在static函数体内使用this指针。
对于第一点:看以下代码:
1 #include <iostream>
2 class student
3 {
4 public :
5 student()
6 {
7 score = 100;
8 number = 123;
9 }
10 static int grade; //因学生年级一样,声明成静态成员
11 private:
12 int score;
13 int number;
14 };
15 int student::grade = 999;
16
17 //main app
18 int main()
19 {
20 student student1;
21
22 std::cout<<"classObject student1 size:"<<sizeof student1<<std::endl;
23 std::cout<<"class student grade:"<<student::grade;
24 }
程序运行后输出:
可见student1为 8个字节,然后将score 和number都声明成静态的。如下代码:
1 #include <iostream>
2 class student
3 {
4 public :
5 static int grade; //因学生年级一样,声明成静态成员
6
7 static int score;
8 static int number;
9 };
10 int student::grade = 999;
11
12 //main app
13 int main()
14 {
15 student student1;
16
17 std::cout<<"classObject student1 size:"<<sizeof student1<<std::endl;
18
19 std::cout<<"class student grade:"<<student::grade;
20 std::cout<<"class student score:"<<student::score;
21 std::cout<<"class student number:"<<student::number;
22 }
见以上代码,该代码是编译不通过的。原因由socre和number引起,报错如下:
这里修改以上代码,可以把20,21行注释,即不输出score和number(相当于不用),或者像第10行代码一样定义它们。出现以上问题的原因是:静态成员score和number没有被定义。修改后程序如下:
1 #include <iostream>
2 class student
3 {
4 public :
5 static int grade;
6 static int score;
7 static int number;
8 };
9 int student::grade = 999;
10 int student::score = 111;
11 int student::number = 222;
12 //main app
13 int main()
14 {
15 student student1;
16
17 std::cout<<"classObject student1 size:"<<sizeof student1<<std::endl;
18
19 std::cout<<"class student grade:"<<student::grade<<std::endl;
20 std::cout<<"class student score:"<<student::score<<std::endl;
21 std::cout<<"class student number:"<<student::number<<std::endl;
22 }
此刻:编译通过,程序运行结果为:
注意:这里student1为 1个字节。
类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据,通过以上实际代码分析,这一知识点更加深入。可见:这对类对象所占用的空间大小是有影响的。当把类中grade、score、number都声明成静态成员时,sizeof该对象,为什么是1呢,哈哈,这留个问题。(说一下,我用的编译器环境:MinGW构建套件中的g++)
本系列关于C++的静态成员的知识总结,未完待续...
-------------------------------------------------------------------------------
知识如何深入到自己大脑中,我想,只有不断地回想和不断地实践。今儿周六,记一笔...