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中复用该函数,就把它的声明提到头文件里去
*/
浙公网安备 33010602011771号