C++ static变量和函数
当一个变量在声明加入static关键字时,该变量就仅仅对当前翻译单元内可见,编译器并不会将其与其他翻译单元进行链接,就像是一个只对当前文件可用的“全局变量”。函数也是如此,如果不需要一个在所有的翻译单元都可见的函数或者是变量,就需要使用static关键字,如果我们在两个文件中定义了变量a将会出错
int a;
#include <iostream>
int a;
multiple definition of `a';
除非我们将其中一个文件的变量a声明为static或者extern
extern int a;
或者
static int a;
类内static变量和函数
static 的类内声明的static被所有的类对象共同拥有,对于一个类,不论声明了多少个类对象,其static成员变量都只有一个,并且所有类对象的静态成员变量都指向同一个内存,它是类的属性,而不是类对象的属性。
#include <iostream>
class entity{
public:
static int x, y;
static void Print(){
std::cout << "x = " << x << std::endl << "y = " << y << std::endl;
}
};
int entity::x; //这就像是在该命名空间下面的一个变量
int entity::y;
int main(int argc, char** argv) {
entity e;
e.x = 2;
e.y = 3;
entity e1;
e1.x = 4;
e1.y = 5;
e.Print();
e1.Print();
}
我们将会得到如下的输出,尽管我们通过不同的类对象调用Print()方法,但是因为其内部成员变量为静态成员变量,所以我们得到的输出将是相同的。
静态成员函数可以不通过类对象被调用,静态成员函数不能处理类对象的非静态成员变量,只能处理static属性。因为静态成员函数并不会有一个对应的类对象,每一个非静态成员函数总会有一个有一个类对象作为类成员函数传入的参数,这是非静态成员函数的内部本质,而静态成员函数则没有这个传入的对象
void Print(entity e){
std::cout << "x = " << e.x << std::endl << "y = " << e.y << std::endl;
}
static成员变量会被使用在需要某个变量和这个类相关,并且该变量会被这个类的所有对象共同使用。