【C++类】 -- 类与static

简介: 【C++类】 -- 类与static

static修饰类中成员,表示类的共享数据

1.static类成员

C++primer里面说过,static类成员不像普通的类数据成员,static类数据成员独立于一切类对象处在。static类数据成员是与类关联的,但不与该类定义的对象有任何关系。即static不会像普通类数据成员一样每一个类对象都有一份,全部类对象是共享一个static类成员的。例如A类对象修改了static成员为1,那么B对象对应的static类对象成员的值也会是1。

注意:static类对象必须要在类外进行初始化

1. class Text  
2. {  
3.     public:  
4.     static int count;  
5. };  
6. 
7. int Text::count=0;//用static成员变量必须要初始化   
8. 
9. int main()  
10. {  
11.     Text t1;  
12.     cout<<t1.count<<endl;   
13. return 0;  
14. }//程序输出0

static修饰的变量先于对象存在,所以static修饰的变量要在类外初始化。因为static是所有对象共享的变量,必须要比对象先存在。

1. class Text  
2. {  
3.     public:  
4.     static int count;  
5. };  
6. 
7. int Text::count=0;//用static成员变量必须要初始化   
8. 
9. int main()  
10. {  
11.     Text t1;  
12.     Text t2;  
13. 
14.     t1.count = 100;     //t1对象把static成员count改为100
15.     cout<<t2.count<<endl; //当t2对象打印static成员的时候,显示的是100而不是0
16. return 0;  
17. }

好处:

用static修饰的成员变量在对象中是不占内存的,因为他不是跟对象一起在堆或者栈中生成,用static修饰的变量在静态存储区生成的。所以用static修饰一方面的好处是可以节省对象的内存空间。如同你创建100个Person对象,而这100个对象都有共有的一个变量,例如叫国籍变量,就是Person对象的国籍都是相同的。

2.static类成员函数

由于static修饰的类成员属于类,不属于对象,因此static类成员函数是没有this指针的,this指针是指向本对象的指针。正因为没有this指针,所以static类成员函数不能访问非static的类成员,只能访问 static修饰的类成员。

1. class Text  
2. {  
3.     public:  
4.     static int fun()  
5.     {  
6. return num;  
7.     }  
8.     static int count;  
9.     int num;  
10. };  
11. int Text::count=5;//用static成员变量必须要初始化   
12. 
13. int main()  
14. {  
15.     Text t1;  
16.     Text t2;  
17.     t1.num=100;  
18. 
19.     t1.fun();//发生错误,fun函数return的是非static类成员 如果return count就正确   
20. return 0;  
21. }
相关文章
|
9天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
36 4
|
10天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
33 4
|
1月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
27 4
|
1月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
23 4
|
1月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
21 1
|
1月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
1月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)
|
1月前
|
存储 编译器 C语言
【C++打怪之路Lv3】-- 类和对象(上)
【C++打怪之路Lv3】-- 类和对象(上)
17 0
|
1月前
|
存储 编译器 C语言
深入计算机语言之C++:类与对象(上)
深入计算机语言之C++:类与对象(上)
|
1月前
|
存储 编译器 C语言
【C++类和对象(上)】—— 我与C++的不解之缘(三)
【C++类和对象(上)】—— 我与C++的不解之缘(三)