- 1.1静态变量-函数中的静态变量
- 1.2静态变量-类中的静态变量
- 1.3静态成员-类对象为静态
- 1.4静态成员-类中的静态函数
- 总结
参考C++那些事-光城大佬的网站
上一篇C++基础复习提升-const那些事
下一篇C++基础复习提升-this那些事
当变量声明为static时,空间将在程序的生命周期内分配。多次调用该函数,静态变量的空间也只分配一次,前一次函数调用中的变量值通过下一次函数调用传递。这有助于存储先前函数状态的值。即多次调用该函数,static修饰的变量值也不会随每次调用函数时重新初始化,不会再重新为此值分配空间。
#include1.2静态变量-类中的静态变量using namespace std; void demo() { // 若不使用static关键字,那么每次调用函数输出的count都重新初始化为0 // 使用static关键字,在程序的生命周期内调用函数输出时会保存上一次的状态值 static int count = 0; cout << count << " " << endl; // 循环5次,count:0,1,2,3,4 count++; } int main() { for (int i = 0; i < 5; ++i) { demo(); } return 0; }
由于声明为static的变量只被初始化一次,因为它们在单独的静态存储中分配了空间,因此类中的静态变量是共享的,对于不同的对象,不能有相同静态变量的多个副本,只能共享类中的静态变量,所以,静态变量是不能使用构造函数初始化的,因为构造函数初始化会为每个实例化的对象创建一个副本。
#include1.3静态成员-类对象为静态using namespace std; class A { public: A(int x); A() {}; static int i; int a; private: }; A::A(int x) : a(x) {} // 类外使用类名和范围解析运算符显示初始化,且只会被初始化一次 int A::i = 2; int main() { A obj1(10), obj2(20); // 此时静态变量i的值没有改变,仍为初始值2,每个对象都共享同一个i值 cout << obj2.i << endl; obj1.i = 3; // 输出3,3 cout << obj1.i << endl; cout << obj2.i << endl; return 0; }
// 非静态对象 #includeusing namespace std; class A { public: A() { cout << "construct is created" << endl; } ~A() { cout << "destroy is created" << endl; } }; int main() { int x = 0; x++; if (x != 0) { A obj; } cout << "End!" << endl; return 0; } // 输出: 构造函数创建,析构函数调用,结束 // construct is created // destroy is created // End!
在上面的程序中,在if块内生命对象为非静态,此时,变量的范围仅在if块呢。随着if块代码运行结束,非静态对象也会调用析构函数进行销毁,因此对象的范围仅在声明它的if块内。
// 静态对象 #includeusing namespace std; class A { public: A() { cout << "construct is created" << endl; } ~A() { cout << "destroy is created" << endl; } }; int main() { int x = 0; x++; if (x != 0) { static A obj; } cout << "End!" << endl; return 0; // 输出:构造函数创建,运行到END(if块结束),程序生命周期结束销毁对象 //construct is created //End! //destroy is created }
当在if块内使用静态对象时,静态对象的范围将会被扩大到贯穿程序的生命周期,也就是只要在程序的生命周期内,就不会销毁静态对象,不论if块是否结束。
1.4静态成员-类中的静态函数静态成员函数仅能访问静态成员变量和静态成员函数,无法访问非静态成员变量和成员函数。
#include总结using namespace std; class A { public: A() { cout << "construct is created" << endl; } ~A() { cout << "destroy is created" << endl; } static void print_message(); static int a; private: int b; }; // static只能在类外定义,类内声明完成后需要赋初始值,否则报错 int A::a = 20; void A::print_message() { A::a = 10; // error:b = 20; 静态成员函数无法访问和操作非静态成员和非静态成员函数 } int main() { A::print_message(); A obj; // a:10 cout << obj.a << endl; return 0; }
若希望保存变量上一时刻的状态,使用static关键字修饰。类中非静态成员函数与对象可以访问与操作静态成员函数与成员变量,但是静态成员函数只能访问与操作静态成员函数与成员变量。



