c++类static成员

转自:http://blog.youkuaiyun.com/heyabo/article/details/8681516


由题目,这里只讨论类中的static作用(类的静态成员),即两点:static数据成员 和 static成员函数。
静态成员的提出:为了解决数据共享问题。

当然全局对象也可以实现数据共享,但相比,static有以下两个优点
(1)封装性:static成员可以是私有成员,而全局对象是全局的,一般用户代码就可以修改这个值。
(2)避免命名冲突:static成员的名字是在类的作用域中,因此可以避免与其他类的成员或全局对象名字冲突。
:static成员均属于类,与类的对象无关。

一、static数据成员
static即静态,指的是被修饰的变量生存期。静态生存期指存放在“全局数据区”中的数据,程序一运行它们就开始存在,程序一结束它们就由系统自动释放。
定义(初始化)
根据类的数据成员不能在类的声明体中初始化,static成员的初始化(在类体外)形式为:
<数据类型> <类名>::<静态数据成员名>=<值>; //此处(定义时)不加static(在类内部声明时需要),以免与一般静态变量或对象相混淆。
声明

而在类体内必须声明:
static <数据类型> <静态数据成员名>;

:因为类声明只声明一个类的“尺寸和规格”,并不进行实际的内存分配。所以在类声明中写成定义是错误的。

引用
<类名>::<静态数据成员名>

  1. class widget  
  2. {  
  3. public:  
  4.     static int var;//声明  
  5. ...  
  6. };  
  7. int widget::var = 10; //定义时初始化  


特殊的整形const static 成员
只要初始化式是一个常量表达式,整型const static 数据成员则需在类的定义体内进行初始化(声明时初始化)。而此时在类的定义体外该成员还必须定义(不必再指定初始值)。

  1. class widget  
  2. {  
  3. public:  
  4.     static const int con_var = 10; //是的,没错,这里是声明  
  5. ...  
  6. };  
  7. const int widget::con_var; //定义  

含static成员的类大小

如:

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. class MyClass  
  5. {  
  6. public:  
  7.     int id;  
  8.     static int rootId;  
  9. };  
  10.   
  11. int main()  
  12. {  
  13.     cout << sizeof(MyClass) << endl;  
  14.   
  15.     return 0;  
  16. }  

输出结果为:4.

为什么不是8?因为类中的static成员变量是放在全局数据存储区的,其不与普通类成员变量放在一块!


二、static成员函数

由于类的static与对象无关,则static成员函数不含this指针,即无法操作对象的成员变量(即不识别对象个体)。
故static成员函数主要用于操作static数据成员(其也只属于类)。
static成员函数与普通成员函数除了this的区别外,还有 两个区别
(1) static成员函数的地址可以用于普通函数指针存储,而普通成员函数地址需要用类成员函数指针来存储。
如:
  1. class widget  
  2. {  
  3. public:  
  4.     static int funA();  
  5.     int funB();  
  6. };  
  7. int (*pfA)() = &widget::funA; //普通的函数指针  
  8. int (base::*pfB)() = &base::funB; //成员函数指针  

(2) 静态成员函数不可以同时声明为virtual、 const或 volatile。
如:
  1. class widget  
  2. {  
  3. pubilc:  
  4. virtual static void funA(); //Error  
  5. static void funB() const//Error  
  6. static void funC() volatile//Error  
  7. ...  
  8. };  

参考文献
1.http://www.yesky.com/20010828/194000.shtml
2.http://blog.youkuaiyun.com/danky/article/details/1447011
3.《C++Primer》

<think>好的,用户想了解C++中的static成员。我需要先回忆一下相关知识,确保准确无误。首先,static成员分为静态成员变量静态成员函数。静态成员属于本身,而不是的实例,这点很重要。 用户可能是刚开始学习C++,所以需要用简单明了的语言解释。可能需要从基本概念入手,比如静态成员的作用、如何声明定义,以及使用的场景。同时,用户可能对静态成员普通成员的区别不太清楚,需要对比说明。 记得要提到静态成员变量必须在外进行定义初始化,否则会导致链接错误。这点容易出错,应该重点强调。另外,静态成员函数不能访问非静态成员,因为它们没有this指针,这也需要解释清楚。 可能用户在实际编程中遇到了相关问题,比如多个对象共享数据,或者工具函数不需要实例化调用的情况。举例说明会更有帮助,比如用计数器或工具函数的例子,让用户更容易理解。 还要注意语法细节,比如内声明加上static关键字,外定义时不加static。另外,访问权限的问题,公有静态成员可以通过名直接访问,私有的话则需要静态成员函数来访问。 需要检查是否有遗漏的点,比如静态常量成员可以在内初始化,但非整型的静态常量还是需要在外定义。这部分可能稍微复杂,但至少提一下,避免用户遇到问题。 最后,总结static成员的优缺点使用场景,帮助用户全面理解。确保语言口语化,避免使用过于专业的术语,但也要准确。结构要清晰,分点说明,让用户逐步理解。</think>关于C++中的static成员,我将分以下四个层次为您解析: $\boxed{1.基本概念}$ - 静态成员是属于本身的成员,而不是的某个具体对象 - 分为两种型: - 静态成员变量(属性) - 静态成员函数(方法) - 所有实例共享同一份静态成员存储空间 $\boxed{2.静态成员变量}$ $$\text{声明格式:}\quad \text{static 数据成员名;}$$ $$\text{定义格式(外):}\quad \text{数据名::成员名 = 初始值;}$$ 特点: - 内存分配在全局数据区 - 必须在外单独定义(除const整型静态成员) - 可通过名直接访问(无需实例化对象) - 示例: ```cpp class Counter { public: static int count; // 声明 Counter() { count++; } }; int Counter::count = 0; // 定义 ``` $\boxed{3.静态成员函数}$ $$\text{声明格式:}\quad \text{static 返回型 函数名(参数);}$$ 特点: - 没有this指针,因此: - 不能访问普通成员变量/函数 - 只能访问静态成员 - 可通过名直接调用 - 示例: ```cpp class MathUtils { public: static double PI() { return 3.1415926; } static int add(int a, int b) { return a + b; } }; // 使用:MathUtils::PI() ``` $\boxed{4.使用场景与注意事项}$ 典型应用场景: - 需要跨对象共享数据时(如计数器) - 工具方法的封装(无需实例化) - 常量定义(结合const) 注意事项: - 静态成员仍需遵守访问控制规则(public/private) - 静态成员函数与普通函数的本质区别 - 多线程环境下需考虑线程安全问题 - 初始化顺序问题(不同编译单元的静态变量) $\boxed{总结}$ 静态成员突破了对象实例的界限,实现了级别的资源共享方法封装。合理使用可以优化内存使用,但需注意其特殊性使用限制。掌握静态成员是理解C++设计的重要环节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值