const 常量定义时必须进行初始化,并且初始化后不可修改
const int a=1;
也可以在类的构造函数的参数列表进行初始化
//初始化参数列表: 属于构造函数的一部分,写法: 以:开头,接初始化成员,多个成员用冒号去隔开
class CTest {
public:
const int m_a;
CTest():m_a(2) {
}
}
对于常量来说,必须在初始化参数列表中指定初始化值
变量也同样可以在这里指定初始化值
对于构造函数来说,先执行初始化参数列表,后执行函数体代码
初始化成员的顺序,取决于成员在类中声明的顺序
class CTest {
public:
int m_a;
int m_b;
CTest(int a) : m_a(a),m_b(m_a) {
}
}
int main()
{
CTest tst(7);
cout << tst.m_a << " " << tst.m_b << endl;
}
输出结果
如果不按照顺序初始化则
class CTest {
public:
int m_a;
int m_b;
CTest(int a) : m_a(m_b),m_b(a) {
}
}
int main()
{
CTest tst(7);
cout << tst.m_a << " " << tst.m_b << endl;
}
输出结果
m_a的值没有被初始化成功
常函数的定义
一般函数中的this指针为
void fun1(/* CTest * const this */)
在常函数中为
void funConst(/* const CTest * const this */) const
常成员函数:在函数中不能修改类中的非静态成员属性,即使是变量,常函数中的this指针:const CTest* const this,有两层const修饰
第一个const,约束了this指针指向的对象不能修改
想要修改变量的值:需要在定义变量前面加上mutable,使得可以在常函数中修改
mutable int m_a; //含义: 这个变量在常函数中可以修改
void funConst(/* const CTest * const this */) const {
cout << m_a << " " << m_b << endl;
this->m_a = 20;
在一般函数中可以调用常函数
void fun1(/* CTest * const this */)
{
cout << "fun1() " << endl;
funConst(); //指针安全级别升高 可以调用
}
常函数指针安全级别高于一般函数
而常函数中不可调用一般函数
static void funStatic() //静态函数只能使用静态成员
//同名同参的一般函数和常函数是重载关系 和同名同参的静态函数不构成重载
void fun2() { cout << "fun2()" << endl; }
void fun2() const { cout << "fun2() const" << endl; }
static void fun2() {cout<<"static void fun2()"<<endl;}
const与指针的结合
const int* p3 = &b; //const 修饰了指针指向的变量 变量b不能通过指针p3修改 但是指针指向可以修改
int* const p4 = &b; //const 修饰了指针本身 指针p4指向不可修改 变量b可以通过指针p4修改