1.静态成员
静态成员:被 static 修饰的成员变量/函数。
可以通过对象(对象.静态成员 )、对象指针(对象指针->静态成员 )、类(类名::静态成员 )访问。
2.静态成员变量
存储在数据段(全局区,类似于全局变量),整个程序运行过程中只有一份内存。
对比全局变量,它可以设定访问权限(public、protected、private),达到局部共享的目的。
必须初始化,必须在类外面初始化,初始化时不能带static。
如果类的声明和实现分离,在实现.cpp中初始化。
#include <iostream>
using namespace std;
class Car {
public:
int m_age;
static int m_price;
static void run() {
cout << "run()" << endl;
}
};
int Car::m_price = 0;
int g_age;
int main() {
g_age = 18;
Car car1;
car1.m_age = 1;
car1.m_price = 2;
cout << Car::m_price << endl;
getchar();
return 0;
}
#include <iostream>
using namespace std;
class Person {
public:
static int m_age;
};
int Person::m_age = 0;
class Student : public Person {
};
int main() {
cout << &Student::m_age << endl;
cout << &Person::m_age << endl;
getchar();
return 0;
}
#include <iostream>
using namespace std;
class Person {
public:
static int m_age;
};
int Person::m_age = 0;
class Student : public Person {
public:
static int m_age;
};
int Student::m_age = 0;
int main() {
cout << &Student::m_age << endl;
cout << &Person::m_age << endl;
getchar();
return 0;
}
3.静态成员函数
内部不能使用 this 指针(this 指针只能用在非静态成员函数内部)
不能是虚函数(虚函数只能是非静态成员函数)
内部不能访问非静态成员变量/函数,只能访问静态成员变量/函数
非静态成员函数内部可以访问静态成员变量/函数
构造函数、析构函数不能是静态
当声明和实现分离时,实现部分不能带static
#include <iostream>
using namespace std;
class Car {
public:
int m_age;
static int m_price;
static void run() {
cout << "run()" << endl;
}
static void other();
};
int Car::m_price = 0;
void Car::other() {
run();
}
int main() {
Car::other();
getchar();
return 0;
}
4.统计对象数量
#include <iostream>
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;
int main() {
Car car;
Car *p = new Car();
delete p;
cout << Car::getCount() << endl;
getchar();
return 0;
}
5.单例模式
单例模式:设计模式的一种,保证某个类永远只创建一个对象。
- 构造函数、析构函数私有化
- 定义一个私有的 static 成员变量指向那个唯一的单例对象
- 提供一个公共的访问单例对象的接口
#include <iostream>
using namespace std;
class Rocket {
private:
Rocket() {}
~Rocket() {}
static Rocket *ms_rocket;
public:
static Rocket *sharedRocket() {
if (ms_rocket == NULL) {
ms_rocket = new Rocket();
}
return ms_rocket;
}
static void deleteRocket() {
if (ms_rocket != NULL) {
delete ms_rocket;
ms_rocket = NULL;
}
}
};
Rocket *Rocket::ms_rocket = NULL;
int main() {
Rocket *p1 = Rocket::sharedRocket();
Rocket *p2 = Rocket::sharedRocket();
Rocket *p3 = Rocket::sharedRocket();
Rocket *p4 = Rocket::sharedRocket();
cout << p1 << endl;
cout << p2 << endl;
cout << p3 << endl;
cout << p4 << endl;
getchar();
return 0;
}
6.new/delete
回收堆空间内存:表示这块堆空间内存可以重新被别人使用。
#include <iostream>
using namespace std;
int main() {
int *p = new int;
*p = 10;
delete p;
getchar();
return 0;
}
|