C++学习6:static关键字
来源:互联网 发布:淘宝真丝客服沟通技巧 编辑:程序博客网 时间:2024/06/14 08:47
推荐阅读http://blog.csdn.net/hackbuteer1/article/details/7487694
这里使用的示例是该博客中的。
c++中的static用于定义静态变量、函数以及类中的静态成员,特点是在程序开始时分配空间,结束时释放空间,默认初始化为0。
简单概括static的作用有两种:
1.改变存储空间位置,实现数据共享。
2.限定作用域,可以防止不同文件中函数重名。
1.静态局部变量
功能:
静态局部变量可以减少函数间的传参,而且作用域只在函数内,不对函数外造成影响,便于管理。
对于一个完整的程序,其内存分布情况如下图:
当定义一个局部变量时,会存储在栈中。使用static能够改变存储方式,在变量前增加static,该变量的存储空间将变为静态存储区,即数据段或BSS段,存储在该区域的数据只有在程序结束时才被释放,不会因函数退出释放空间。
来看一个具体的例子:
#include<iostream> using namespace std; void fn(); int main(void) { fn(); fn(); fn(); system("pause"); return 0; } void fn() { static int n = 10; cout<<n<<endl; n++; }
运行结果如图:
在函数fn中定义了一个静态局部变量n,其存储在数据段中,只在第一次调用时进行初始化,之后再次调用时不再重复初始化。可以看到,静态局部变量起到了全局变量的作用,n的值可以一直保持。
静态局部变量的性质:
相对于局部变量,其区别在于存储在数据段中,不随函数结束被释放,能够保持到程序结束,而且未初始化的静态局部变量会自动初始化为0。
相对于全局变量,其区别在于作用域只在函数中,不会对函数外造成影响。
2.静态全局变量
功能:
将全局变量作用域只限定在本文件内,可以防止不同文件间的重名冲突。
在全局变量前增加关键字static,就成为了一个静态全局变量,示例如下:
#include<iostream> using namespace std; static int n; //定义静态全局变量 void fn() { n++; cout<<n<<endl; } int main(void) { n = 20; cout<<n<<endl; fn(); return 0; }
运行结果和全局变量是相同的,其与全局变量的区别在于:
1.未初始化的静态全局变量自动初始化为0。
2.静态全局变量不能被其他文件调用,使用extern声明也无法对其进行调用。因此在其他文件中可以定义相同名字的变量。
3.静态函数
功能:
将函数的作用域限定在本文件中。
在函数的返回类型前增加static关键字,就成了一个静态函数,示例如下:
#include<iostream> using namespace std; static void fn(); //声明静态函数 int main(void) { fn(); return 0; } void fn() //定义静态函数 { int n = 10; cout<<n<<endl; }
其与普通函数的区别在于:
静态函数不能被其他文件调用,因此在其他文件中可以定义相同名字的函数。
4.类中的静态成员
功能:
静态成员变量可以实现不同类对象间成员变量的共享。静态成员函数针对类成员,不需要针对特定对象。
static可以在类中的使用,定义静态成员变量和静态成员函数,可以对应静态变量和静态函数来理解。静态成员之间可以相互访问,但是不能访问非静态成员。而非静态成员可以访问静态成员。
静态成员变量,示例如下,静态成员变量遵循public,protected,private访问规则,可以是private成员,而全局变量是不可以的。
#include<iostream> using namespace std; class Myclass { private: static int a; //声明静态数据成员};
和静态局部变量和静态全局变量一样,静态成员变量的存储空间发生了改变,一次定义初始化后会始终保持,直到程序结束。因此不管该类对象被定义了多少个,只分配一次空间,也就是说该静态成员变量为所有对象共用。
静态成员函数,示例如下:
#include<iostream> using namespace std; class Myclass { private: static int sum; //声明静态数据成员 public: static void GetSum(); //声明静态成员函数 }; void Myclass::GetSum() //静态成员函数的实现 { cout<<"sum="<<sum<<endl; }
需要注意:静态成员函数的定义只能在类中,类外的定义不能指定static关键字。而且静态成员函数不具有this指针,这也是它不能访问类对象的非静态成员的原因。
- C学习之一:static关键字
- static关键字用法学习笔记(C++)
- static关键字用法学习笔记(C++)
- 学习C/C++中static关键字
- C++学习6:static关键字
- Java学习6:static关键字
- c/c++-----static关键字
- 【C/C++】关键字static
- c/c++static关键字
- C++-static 关键字
- c/c++ static关键字
- C 关键字extern、static
- c语言关键字static
- C/C++ static 关键字
- c static关键字理解
- c++static关键字
- C关键字--static
- c语言static关键字
- java常量池概念
- Spark缓存策略说明及选择
- python pass (空操作)语句
- UISearchBar类介绍与使用和UISearchController的使用
- 20170628
- C++学习6:static关键字
- form提交
- android菜鸟练手小项目之自定义日历,涵盖LitePal数据库,极光推送,聊天机器人(四)
- (二)二叉树
- ZooKeeper 倪超著 观后感
- JS Array(数组)本地面向对象总结和运用
- 2018考研英语暑期怎么复习?老师只建议你大量阅读
- tomcat 与 weblogic 区别
- 《学习opencv》第四章第三题(全)