特殊的成员:
1.const成员:
1.const数据成员:
特点:1.必须使用成员初始化列表初始化
2.不能修改const成员的值
[必须使用成员初始化列表初始化的:
1.const数据成员
2.指针常量(int* const p)
3.引用(普通引用和常饮用都要)]
2.const成员函数:
特点:1.返回值类型 函数名(形参表)const;//声明和定义
2.函数内的this指针变为常量指针;
(指向的数据成员不能被修改,传进来的形参可以被修改)
3.只能调用const修饰的成员函数;
2.static成员:
1.static数据成员:(全局区)
特点:
1.被类的所有对象共享,内存只存在一份;(内存不计入类的内存)
(A对象改变了静态变量的值,B访问时已经改变后的值)
2.必须在类外初始化:(一般在同名的.cpp里)
//类型 类名::变量名 = 初始值;//省略初始值默认为0
3.访问方式:1.对象.成员
2.类名::成员(推荐)
4.static const成员不需要使用成员初始化列表初始化;
2.static成员函数:(static写在声明中/定义里不用写)
特点:
1.访问方式:1.对象.函数名(实参表)
2.类名::函数名(实参表)(推荐)
2.函数内只能访问静态成员
----------------------------------
==单例模式:==只能创建一个对象,(例如游戏管理)
步骤:
1.构造函数私有化:为了防止在类外创建对象
(把构造函数写成 private)
2.添加 静态函数:用来创建对象
1.全局(static)
2.堆区(new)
3.定义静态指针 : 记录创建对象的地址(第二种)
第一种: 创建一个静态全局变量 然后返回引用
static GameManage& getInstance()
{
static GameManage gameManage;
return gameManage;
}
创建:
1.GameManage::getInstance().gameState = START;
2.GameManage& gameManage = GameManage::getInstance();
gameManage.gameState = START;
第二种: 堆区:(new)
.h:
private:
static SingleInstance* pInstance;//创建静态指针记录
public:
static SingleInstance* getInstance();
.cpp:
初始化:SingleInstance* SingleInstance::pInstance = nullptr;
SingleInstance* SingleInstance::getInstance()
{
//需要记录是否创建了对象:定义一个静态指针pInstance
//判断pInstance是否为空,如果为空,创建一个对象
//不为空返回地址
if(nullptr == pInstance)
{
pInstance = new SingleInstance;//申请对象
}
return pInstance;
}
如果用new来创建对象,在析构函数中需要将静态指针置空,否则会造成野指针
SingleInstance::~SingleInstance()
{
pInstance = nullptr;
}
----------------------------------
const的用法:
1.const修饰普通类型的变量,表示变量只读;
2.常量指针:表示指针指向一个被const修饰的变量,指向的内容不能修改;
3.指针常量:表示指针本身是一个被const修饰的变量,指向不能修改;
4.常引用:const修饰引用,表示不能通过引用改变被引用对象的值;
5.const数据成员;
6.const成员函数;
static用法:
1.static全局变量:
2.static局部变量:
注意:
1.所有在全局区的变量都会默认初始化为0;
2.写在函数内的静态变量只初始化一次;