static、const、extern等关键字
- static
参考:https://blog.csdn.net/guotianqing/article/details/79828100
http://c.biancheng.net/view/2227.html
static变量存在全局数据区,定义时若未赋值,会自动初始化为0。
1)静态局部变量
static修饰局部变量时,作用域为定义它的函数内。
函数返回后,静态局部变量值不变。
1 #include<stdio.h> 2 void fun() 3 { 4 static i=2; 5 i++; 6 printf("i = %d\n",i); 7 } 8 9 void main() 10 { 11 fun(); 12 fun(); 13 }
运行结果:
i = 3 i = 4
2)静态全局变量
静态全局变量的作用域在本文件内,其他文件不能访问。所以其他文件可以定义同名变量
3)类的静态成员
①静态成员变量
静态成员变量在初始化时分配内存空间,所以不能再类内部定义。初始化时不能加static
静态成员变量不属于任何对象,属于整个类,可直接用类进行操作。
②静态成员函数
静态成员函数不属于任何对象(因此没有this指针),属于整个类,可直接用类进行操作。
非普通成员函数可以任意地访问静态成员函数和静态数据成员。
静态成员函数没有 this指针,不知道指向哪个对象,无法访问对象的成员变量,也就是说静态成员函数不能访问普通成员变量,只能访问静态成员变量。
- const
1)修饰指定的变量不能被修改
const int a = 5;/*a的值一直为5,不能被改变*/
const int b; b = 10;/*b的值被赋值为10后,不能被改变*/
const int b; b = 10;/*b的值被赋值为10后,不能被改变*/
int const *ptr;
const int *ptr; /*ptr为指向整型常量的指针,ptr的值可以修改,但不能修改其所指向的值*/
int *const ptr;/*ptr为指向整型的常量指针,ptr的值不能修改,但可以修改其所指向的值*/
const int *const ptr;/*ptr为指向整型常量的常量指针,ptr及其指向的值都不能修改*/
const int *ptr; /*ptr为指向整型常量的指针,ptr的值可以修改,但不能修改其所指向的值*/
int *const ptr;/*ptr为指向整型的常量指针,ptr的值不能修改,但可以修改其所指向的值*/
const int *const ptr;/*ptr为指向整型常量的常量指针,ptr及其指向的值都不能修改*/
总结:若const位于*号左侧,则const修饰的是指向的变量;若const位于*号右侧,则const修饰的是指针不可修改;
所以int const* ptr和const int *ptr情况一样。
2)修饰函数形参,形参只能在调用时赋值,不能在函数体内修改。
3)修饰函数返回值不能被修改。如键盘输入的值const *str=getstr();
4)类的有些成员函数不改变成员变量,只获取成员变量,是“只读”函数,这时可把该成员函数加上const进行标识。
eg:
1 class Point 2 { 3 int xVal, yVal; 4 public: 5 int GetY() const; 6 } 7 int Point::GetY() const //实现时也必须一样的方式,后面加const 8 { 9 return yVal; 10 }
只读函数既不能改变yVal的值,也不能调用会改变yVal的函数,只能调用const函数。
不能把const放在前面,那样就返回值变成了固定的,意义不同了。