目录
常量的初始化
常量必须在定义的时候进行初始化
const int b;//error 常量必须要在定义的时候初始化
const int a = 123;
常量引用
const 声明的引用可以被任意同类型int,string...所赋值初始化,初始化后的常量引用不能再被修改
const int a = 10;
const int &aa = a;
aa = 123;//erro const int 不能修改数值
常量成员初始化
型的成员除在定义的时候初始化外,必须在构造函数以列表形式初始化
class Test
{
public:
//1. 初始化列表跟变量声明的顺序无关
//2. 任何常量类型的成员必须在所有的构造函数中进行初始化
Test(int a, int b,int c,int* ptr,const int* const pptr):S(c),_b(b),_a(a),pS(ptr),ppS(pptr)
{
//pS = ptr;//必须是可修改的左值
cout << "构造函数执行" << endl;
}
Test(int a):S(a),pS(nullptr),ppS(nullptr)
{
}
public:
int _a;
int _b;
const int S;
int* const pS;
const int* const ppS;
};
常量成员函数
常量成员函数主要约束函数内部对成员变量的修改,具有保护作用
float Player::GetATK() const {
playerProperty.Combo.ATK = 12;//error : 不能修改的左值;playerProperty是类内部的成员 变量
float atk = playerProperty.Combo.ATK + GetEquipATK();
return atk;
}
带有返回引用类型的常量成员函数
//错误!常量成员函数不能返回带有引用的返回值,需要加修饰
Entity& GetEntity() const
{
return new_et;
}
//const成员函数返回的引用必须是常量引用,常量引用的作用是不创建副本,但外部也不可以做任何修改
Entity const& GetEntity() const
{
return new_et;
}
返回指针类型的常量成员函数
//可以修改指针所指的成员,但不能修改指针本身
Entity* Get() const
{
//height = 123;//error
ptrET->name = "123";
return ptrET;
}
int height;
Entity new_et;
常量返回引用类型函数与普通函数区别
class Enemy
{
public:
Enemy()
{
Atk = 100;
Def = 200;
}
int Atk;
int Def;
};
class Test
{
public:
Test(int num):a(num)
{
}
const int a;
//不能修改返回值以及返回对象的内部成员
Enemy const& GetEnemy() const
{
return enemy;
}
//可以修改返回值,不能修改内部成员
Enemy GetEnemy2()const
{
return enemy;
}
//可以修改返回值和内部成员
Enemy& GetEnemy3()
{
return enemy;
}
Enemy enemy;
};
int main()
{
Enemy en2;
Test t(100);
cout<<t.GetEnemy().Atk<<endl;
//t.GetEnemy().Atk = 500;//erro:表达式必须是可以修改的左值
//t.GetEnemy() = en2;//不能修改一个const Enemy
//t.GetEnemy2().Atk = 500;//erro:表达式必须是可以修改的左值
//可以直接修改Enemy对象,但不支持修改内部成员
t.GetEnemy2() = en2;
//可以直接修改Enemy对象,也支持修改内部成员
t.GetEnemy3().Atk = 500;
t.GetEnemy3() = en2;
system("pause");
return 0;
}
常量对象
常量对象只能访问常量成员和常量成员函数