1_static关键字的使用

1. static和auto的相似之处


// 只不过这里auto默认省略不写
auto int a=10;
auto string str="this is a string";

static int a=10;
static string str="this is a string";

区别是:

  • auto是由程序自动控制变量的生命周期;
  • static变量的生命周期不是自动控制,而是跟随程序本身。在初始化程序时分配,程序退出时释放。

如下:

  • 每次调用func时都会重新分配a变量,多个线程调用时a变量互相独立;但是b变量在程序初始化时就分配了,不管有没有调用func都会分配,多线程调用func时共用同一个b变量。
void func(){
  int a;
  static int b;
}

2. static在类中的用法:修饰成员变量和成员函数



class Girl{
private:
  static string name;     // static是声明性的关键字
  static void SayHi();
};

string Girl::name="Chow"; // 类外全局初始化
void Girl::SayHi(){cout<<"Hi~"<<endl;}

注意点:

可以理解string Girl::name="Chow"为全局变量,只不过带有类安全属性的;static成员函数,可以理解为,增加了类的访问权限的全局函数;因此,访问类的static成员不用创建实例对象。

  • static成员,在类中声明,.cpp中全局初始化。且必须要初始化。因为程序一开始就会给它分配内存,必须初始化。

  • static成员,该类的所有实例对象共用。是在该类的范畴内的全局变量。

  • static成员不属于对象,访问类的static成员不用创建实例对象,Girl::name和Girl::func()就可以直接访问。

  • static成员函数,只能访问类的static变量。static成员函数中也没有this指针

  • static成员函数,不可设为虚函数,因为虚函数是运行时绑定,static是程序一开始就分配初始化了,不能参与多态和动态绑定。static成员与类相关,与对象实例不相关,没有this指针无法访问非静态成员。

3. static在.cpp全局区域的用法:只在.cpp内有效的全局变量和全局函数


// 在全局区域声明变量和函数


static int a=10;    // static作用是,指定a只在本.cpp文件内有效。不共享。不同cpp内的同名变量a,互相独立
int a=0;           // 错误写法,用意不明,只在本.cpp用?还是共享?


/*
 * 如何在不同.cpp中共享变量?
 *
 * 在.h头文件中用extern关键字声明,extern int a;
 * 然后再任意一个对应的.cpp中初始化一次就可以了。
 */



static void SayHi(){cout<<"Hi"<<endl;} // static作用是,指定该函数只在本.cpp文件内有效。不共享。不同cpp内的同名函数,互相独立
void SayHi(){cout<<"Hi"<<endl;}       // 错误写法,用意不明

/*
 * 如何让多个.cpp复用一个函数?
 * 多个.cpp中复用该函数,就把它的声明提到头文件里去
 */

posted @   itsinsane  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示