静态变量
函数中使用static
当变量声明为static
时,变量空间将在程序的生命周期内分配。即使多次调用该函数,静态变量的空间也『只分配一次』,前一次调用中的变量值通过下一次函数调用传递。这对于在C/C++或需要存储先前函数状态的任何其他应用程序非常有用
void demo() {
static int count = 0;
cout << count << " ";
count++;
}
int main() {
for (int i = 0; i < 5; i++)
demo();
return 0;
}
0 1 2 3 4
可以看到count
在不断累加,static
变量的空间只分配一次,每次调用之后不会再进行初始化
类中使用static
- 类中的
static
变量只能声明,定义要放在类外面
由于声明为static的变量只被初始化一次,因为它们在单独的静态存储中分配了空间,因此类中的静态变量『由对象共享』。对于不同的对象,不能有相同静态变量的多个副本。也是因为这个原因,静态变量不能使用构造函数初始化
class Human {
public:
static int ip; // 类中声明static变量
private:
string _name;
int _age;
};
int Human::ip = 0; // 类外定义static变量
int main(int argc, char const *argv[]) {
Human kavin("kavin", 23);
cout << kavin.ip << endl; // 0
kavin.ip = 10;
Human* jack = new Human("jack", 12);
jack->ip = 30;
cout << kavin.ip << endl; // 30
return 0;
}
可以看到不同对象都可以对static
变量进行修改,他们是共享的
静态变量需要初值
在C++11标准下,static
搭配const
就可以在类内初始化
class A {
static const int num = 5;
// 或者 enum { num = 5 };
int arr[num];
};
这里数组必须知道大小,所以就必须在给num
赋初值
也可以用enum
静态成员
类对象为静态
先看看非静态对象的效果
int main(int argc, char const *argv[]) {
int x = 1;
if (x == 1) {
int num1 = 100;
Human kavin("kavin", 23, num1);
}
cout << "main function end" << endl;
return 0;
}
Destructor: delete ptr
main function end
因为kavin
对象的生命周期在if
语句结束之后就结束了,所以就会调用析构函数
如果将对象声明为静态
int main(int argc, char const *argv[]) {
int x = 1;
if (x == 1) {
int num1 = 100;
static Human kavin("kavin", 23, num1);
}
cout << "main function end" << endl;
return 0;
}
main function end
Destructor: delete ptr // main结束后才调用析构函数
静态对象的声明周期贯穿整个程序,所以在程序结束之后才会调用析构函数
类中的静态函数
就像类中的静态数据成员或静态变量一样,静态成员函数也不依赖于类的对象。我们被允许使用对象和.
来调用静态成员函数
- 建议使用类名和范围解析运算符调用静态成员
- 静态成员函数仅能访问静态数据成员或其他静态成员函数,它们无法访问类的非静态数据成员或成员函数。
class Human {
public:
static int ip;
static void info();
};
int Human::ip = 0;
void Human::info() {
cout << ip << endl;
// Introduce(); //error,不能调用非静态成员函数
}
int main(int argc, char const *argv[]) {
Human kavin("kavin", 23);
kavin.ip = 10;
Human::info(); // 10
return 0;
}