Static关键字所有用法详解
2016-07-13 10:22
363 查看
以前总是对static的涵义模棱两可,不太敢用,也不知道什么地方该用。其实static用法非常广泛,静态变量、静态成员、静态函数等,如果用的好,会使程序提升一个等级,并且可以解决很多实际问题,比如单例模式…而且静态数据成员存储在静态存储区,只存储一次,可以节省内存。所以在这里尽自己目前的理解做一个总结:
用法1:static局部变量
我的理解是有点类似全局变量的功能,但只能被赋值一次,也就是说函数第一次赋值之后,会一直保存这个值。
用法2:static全局变量
静态全局变量和静态局部变量类似,只是作用域不同,都是存储在全局数据区。
关于存储区:new产生的动态数据存储在堆去;自动变量存储在栈去,会自动释放;而静态变量和全局变量存储在全局存储区,不会随函数退出而释放。
与一般全局变量的区别:
static全局变量只初始化一次
仅能在本文件中使用,其它文件可以定义相同名字的变量
用法3:static函数
只要记住一点:静态函数与普通函数的区别,只能在声明它的地方可见,不能被其它文件所使用
总结1:若全局变量仅在单个文件中可用,则声明为static全局变量,若全局变量仅在单个函数内部可用,则声明为static局部变量。
OK,讲完了面向过程,该轮到面向对象了,这也是我觉得static比较精华的地方。
用法4:static数据成员
静态成员可供所有的对象访问,只分配一次内存,也只有一份拷贝,对于每个对象都是一样,它的值可以更新;
静态成员存储在全局数据区,因此不能类声明中定义,初始化规则:<数据类型><类名>::<静态数据成员名>=<值> ,在使用前必须初始化;
访问:通过对象或者类名来访问;
静态成员的访问符和普通成员一样:public、protected、private;
作用:
实现全局性,但不会与程序中其它全局名字冲突
与private搭配,可实现信息隐藏
一个计数的例子
用法5:static成员函数
与静态成员类似,它是类内部共同享用,和普通函数不同,静态成员函数没用this指针;
访问:与静态成员类似通过类名或对象;
非静态成员函数可以任意地访问静态成员函数和静态数据成员,但反过来不行;
静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
用法1:static局部变量
我的理解是有点类似全局变量的功能,但只能被赋值一次,也就是说函数第一次赋值之后,会一直保存这个值。
void f() { static int st=10; st++; cout<<st<<endl; } int main() { f(); f(); f(); } 输入结果为:11 12 13
用法2:static全局变量
静态全局变量和静态局部变量类似,只是作用域不同,都是存储在全局数据区。
关于存储区:new产生的动态数据存储在堆去;自动变量存储在栈去,会自动释放;而静态变量和全局变量存储在全局存储区,不会随函数退出而释放。
与一般全局变量的区别:
static全局变量只初始化一次
仅能在本文件中使用,其它文件可以定义相同名字的变量
用法3:static函数
只要记住一点:静态函数与普通函数的区别,只能在声明它的地方可见,不能被其它文件所使用
static void f(); int main() { f(); } void f() { cout<<"fuck"<<endl; }
总结1:若全局变量仅在单个文件中可用,则声明为static全局变量,若全局变量仅在单个函数内部可用,则声明为static局部变量。
OK,讲完了面向过程,该轮到面向对象了,这也是我觉得static比较精华的地方。
用法4:static数据成员
静态成员可供所有的对象访问,只分配一次内存,也只有一份拷贝,对于每个对象都是一样,它的值可以更新;
静态成员存储在全局数据区,因此不能类声明中定义,初始化规则:<数据类型><类名>::<静态数据成员名>=<值> ,在使用前必须初始化;
访问:通过对象或者类名来访问;
静态成员的访问符和普通成员一样:public、protected、private;
作用:
实现全局性,但不会与程序中其它全局名字冲突
与private搭配,可实现信息隐藏
一个计数的例子
class Example { public: static int count; Example() { count++; } }; int Example::count = 0; int main() { Example e1,e2; cout<<Example::count<<endl; } 输出:2
用法5:static成员函数
与静态成员类似,它是类内部共同享用,和普通函数不同,静态成员函数没用this指针;
访问:与静态成员类似通过类名或对象;
非静态成员函数可以任意地访问静态成员函数和静态数据成员,但反过来不行;
静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
class Example { private: int m1; public: static int count; Example() { count++; } static void f1(); void f2() { f1();//OK } void f3(); }; void Example::f1() { cout << m1 << endl;//错误调用 f3();//错误调用 cout << count << endl;//OK }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 理解C#编程中的静态类和静态成员以及密封类
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析