static修饰变量初始化
static修饰的变量未初始化,会被放到bss段,自动初始化为0。并且static 修改的变量初始化语句只执行一次,并不会多次执行。
static 修饰变量,会影响变量的生命周期,因为被数据被加载到了 静态全局区,所以生命周期随程序。并且链接属性变为local,无法被其他源文件链接
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define SIZE 4096*4096
void Fun()
{
static int i = 1;
printf("第%d次\n",i++);
}
int main()
{
Fun();
Fun();
Fun();
Fun();
Fun();
Fun();
Fun();
Fun();
return 0;
}
打印结果
第1次
第2次
第3次
第4次
第5次
第6次
第7次
第8次
类内static 修饰
类内static修饰只会改变该符号的访问方式,也就是该成员属于整个类,而不是类的对象,并且经static修饰后的成员函数没有了隐含this指针这个参数,那么它的内部是不能访问非静态成员函数和非静态成员变量的,相反非静态成员函数可以访问静态成员函数。
总结
- static关键词仅与静态成员的在类定义中的声明一起使用,不与静态成员的定义一起使用
- 类体内的声明不是定义,可以拥有不完整类型
- 类内static函数无隐含this指针选项
- 静态成员函数不能被 const volatile virtual修饰 (因为没有this指针)
- 常量静态成员变量(const 修饰的成员变量)必须在类内初始化
- 静态成员的链接属性跟类的链接属性相同,如果类在匿名命名空间内则类链接属性变为局部,静态成员的链接属性变为局部。否则,如果类在全局作用域内,类的链接属性是全局的那么类的静态成员链接属性也是全局的。
- 写在全局作用域内的非ADT类型的内置类型其链接属性被改为local,静态的内置变量生命周期改为静态全局区。(这条也就是static在C语言中的应用)
变量命名
变量命名的时候不要用 i , j ,k ,最好用可以表述其意义的英文。并且如果在 vim 下 我们使用 i , j ,k 的时候。如果进行底行模式下的替换,举列子如果把 i 替换成 xxx , 那么这样不至i ,所有包括 i 的单词都会被替换,size_t 就会被替换成 sxxxze_t 这样还是比较坑的。