static 在c和c++中异同

static的三个作用:

(1)局部静态变量

(2)外部静态变量/函数

(3)静态数据成员/成员函数

前两种C和C都有,第三种仅在C中有

  • 函数内static局部变量:变量在程序初始化时被分配,直到程序退出前才被释放,也就是static是按照程序的生命周期来分配释放变量的,而不是变量自己的生命周期。多次调用,仅需一次初始化。
  • cpp内的static全局变量:只在cpp内有效。在不同的cpp文件中定义同名变量,不必担心命名冲突。保持变量内容的持久。
  • 头文件内的static全局变量:在每个包含该头文件的cpp文件中都是独立的。不推荐使用。
  • static函数:仅在当前文件内有效。在不同的cpp文件中定义同名函数,不必担心命名冲突。对其它源文件隐藏。在现代C++中被无名namespace取代。
  • 类的static数据成员:必须在class的外部初始化
  • 类的static函数:不能访问类的私有成员,只能访问类的static成员,不需要类的实例即可调用。可以继承和覆盖,但无法是虚函数。属于整个类而非类的对象,没有this指针。静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数。

局部静态变量

#include <iostream>    
using namespace std;    
    
void staticLocalVar()    
{    
    static int a = 0;    
    cout<<"a="<<++a<<endl;    
}    
    
int main()    
{    
    staticLocalVar();   // a=1    
    staticLocalVar();   // a=2    
    system("pause");    
    return 0;    
}    

外部静态变量/函数

​ //file1.cpp
​ static int varA;
​ int varB;
​ extern void funA()
​ {
​ }

static void funB()     
{     
}     
    
//file2.cpp     
extern int varB; // 使用file1.cpp中定义的全局变量     
extern int varA; // 错误! varA是static类型, 无法在其他文件中使用     
extern void funA(); // 使用file1.cpp中定义的函数     
extern void funB(); // 错误! 无法使用file1.cpp文件中static函数 

静态数据成员

​ xxx.h文件
​ class base
​ {
​ private:
​ static const int _i; //声明,标准c++支持有序类型在类体中初始化,但vc6不支持。
​ };

xxx.cpp文件              
const int base::_i = 10;    //定义(初始化)时不受private和protected访问限制.  

静态成员函数

​ class base
​ {
​ static int func1();
​ int func2();
​ };

int (*pf1)() = &base::func1;        //普通的函数指针             
int (base::*pf2)() = &base::func2;  //成员函数指针 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×