静态成员
- 静态成员: 被
static
修饰的成员变量/函数
可以通过对象(对象.静态成员)、对象指针(对象指针->静态成员)、类访问(类名::静态成员)
- 静态成员变量
存储在数据段(全局区,类似于全局变量),整个程序运行过程中只有一份内存
不需要创建对象就存在
对比全局变量,它可以设定访问权限(public、protected、private),达到局部共享的目的
必须初始化,必须在类外面初始化,初始化时不能带static,如果类的声明和实现分离(在实现.cpp中初始化)
- 静态成员函数
内部不能使用this指针(this指针只能用在非静态成员函数内部)
不能是虚函数(虚函数只能是非静态成员函数)
内部不能访问非静态成员变量\函数,只能访问静态成员变量\函数
非静态成员函数内部可以访问静态成员变量\函数
构造函数、析构函数不能是静态
当声明和实现分离时,实现部分不能带static1 2 3 4 5 6 7 8
| class Car { public: static int m_price; void run() { std::cout << "run" << std::endl; } }; int Car::m_price = 0;
|
1 2 3 4 5 6 7 8 9 10 11
| class Car { protected: int m_age; static int m_price; public: void run() { std::cout << "run" << std::endl; m_price = 10; } }; int Car::m_price = 0;
|
static 应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include <iostream> #include <cstdio> using namespace std;
class Car { private: static int ms_count; public: Car() { ms_count++; } ~Car() { ms_count--; } static int getcount() { return ms_count; } }; int Car::ms_count = 0;
Car g_car;
int main() { Car car; Car* p = new Car(); delete p; cout << Car::getcount() << endl;
return 0; }
|
static 单例模式
单例模式:设计模式的一种,保证某个类只能创建一个对象
- 构造函数/析构函数私有化
- 定义一个私有的
static
成员变量指向唯一的那个单例对象
- 提供一个公共的访问单例对象的接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include <iostream> using namespace std;
class Rocket { private: Rocket() {} ~Rocket() {} static Rocket* ms_rocket; public: static Rocket* shareRocket() { if (ms_rocket == NULL) { ms_rocket = new Rocket(); } return ms_rocket; } static void deleteRocket() { if (ms_rocket != NULL) { delete ms_rocket; ms_rocket = NULL; } } void run() { cout << "Rocket::run" << endl; } }; Rocket* Rocket::ms_rocket = NULL;
int main() { Rocket* p1 = Rocket::shareRocket(); Rocket* p2 = Rocket::shareRocket(); Rocket* p3 = Rocket::shareRocket(); Rocket* p4 = Rocket::shareRocket(); p1->run(); cout << p1 << endl; cout << p2 << endl; cout << p3 << endl; cout << p4 << endl;
return 0; }
|