C89:论静态(static)

一.简介

Const修饰的类型跟它自己的内存值有关,而Static修饰的类型跟它内存生命周期有关多线程

只用于本文件的函数要所有使用static关键字声明,这是一个良好的编码风格

(1)对其余源文件隐藏

(2)保持变量内存的持久,保持惟一性,只占一分内存

(3)默认初始化为0
函数

注意:形参不能被static修饰this

 

  • 规则:

规则1:普通局部变量用完就释放,因此当咱们须要屡次用到同一份变量数据的时候,就能够用static来留住这个变量的数据编码

 

 

 

二.用于C代码

(1)修饰局部变量

保持内存的持久(保持惟一性,只占一分内存)spa

规则1:普通局部变量用完就释放,因此当咱们须要屡次用到同一份变量数据的时候,就能够用static来留住这个变量的数据线程

void A(){
     
    //普通局部变量存储于进程栈空间,使用完毕后会当即释放
    //静态局部变量编译器会默认初始化为0,存储于进程的全局数据区,程序结束时释放
    static int a=1;
}

 

(2)修饰全局变量

对其余源文件隐藏指针

规则2:全局变量可能会致使多线程竞争同一份数据,用static能够把变量留住在单一源文件里面使用code

//全局变量自己就有内存的持久性,因此静态全局变量用于在其余源文件屏蔽该变量
  
//全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化
//普通全局变量对整个工程可见,其余文件可使用extern外部声明后直接使用,也就是说其余文件不能定义一个同名的变量
//静态全局变量仅对其当前文件可见,其余文件不可访问,其余文件能够拥有同名的变量
  
  
//file1.cpp
int varA;
static int varB;
  
//file2.cpp
extern int varA;        //使用其余源文件的全局变量
extern int varB;        //错误,静态全局变量被屏蔽

 

(3)修饰全局函数

对其余源文件隐藏对象

规则3:blog

//非静态函数能够在另外一个文件中直接引用没必要加extern声明
//静态函数只能在声明它的文件中可见,其余文件不能引用该函数
//不一样的文件可使用相同名字的静态函数
  
//file1.cpp
  
extern void funA(){}
static void funB(){}
  
//file2.cpp
  
extern void funA();    //使用其余源文件的全局变量
extern void funB();    //错误,静态全局函数屏蔽了该函数

 

三.用于C++代码

非静态成员可以访问静态成员,由于生命周期还在.

静态成员不能访问非静态成员

(1)修饰类的静态成员变量

默认初始化为0,保持内存的持久(保持惟一性,只占一分内存),不存在this指针

//静态成员能够独立访问,无须建立任何对象实例就能够访问
//静态成员变量每一个class只有一份变量内存(全局数据区/静态区),而普通成员函数每一个对象都有不一样的变量内存
  
//test.h
class A{
    private:
        static const int a;
}
  
//test.cpp
const int A::a=1;    //不受private和protected访问限制

 

(2)修饰类的静态成员函数

保持内存的持久(保持惟一性,只占一分内存)

 

//类的静态成员函数没法调用类的非静态成员函数和变量,由于静态成员函数没有this指针
//类的非静态成员函数能够调用类的静态成员函数和变量
//静态成员函数不能够同时声明为virtual const volatile函数
  
class A{
    public:
        virtual static void fun1();    //错误
        static void fun2() const;      //错误
        static void fun2() volatile;   //错误
};
相关文章
相关标签/搜索