从 C 向 C++ 进阶系列导航
1. const 对象
const 对象为只读对象,只能调用 const 成员函数,因此无法直接修改成员变量。可通过指针方式间接访问非 const 成员函数与修改成员变量。
- 实验:
class Test
{
private:
int m_Var;
public:
Test(int num)
{
m_Var = num;
}
void print_con(void)const
{
cout << "m_Var = " << m_Var << endl;
}
void print(void)
{
cout << "m_Var = " << m_Var << endl;
}
void set(int num)
{
m_Var = num;
}
};
int main()
{
const Test obj = 3;
// obj.print(); // error: passing ‘const Test’ as ‘this’ argument discards qualifiers
obj.print_con(); // m_Var = 3
Test* p = (Test*)&obj;
p->set(4);
obj.print_con(); // m_Var = 4
return 0;
}
2. coust 成员变量
const 成员变量必须在类的构造函数中通过初始化列表方式进行初始化,其余属性与普通的 const 变量一致。
- 实验:
class Test
{
private:
const int m_Var;
public:
Test() : m_Var(8)
{
}
void print(void)
{
cout << "m_Var = " << m_Var << endl;
}
void set(int num)
{
// m_Var = num; // error: assignment of read-only member ‘Test::m_Var’
int* p = (int*)&m_Var;
*p = num;
}
};
int main()
{
Test obj;
obj.print(); // m_Var = 8
obj.set(3);
obj.print(); // m_Var = 3
return 0;
}
3. const 成员函数
const 成员函数有以下特点:
- const 成员函数的声明和实现必须要使用 const 关键字限制。
- 如果 const 成员函数构成函数重载,const 对象只能调用 const 成员函数,非 const
对象优先调用非 const 成员函数。- const 成员函数内只能调用 const 成员函数。非 const 成员函数可以调用 const 成员函数。
- const 成员函数内不能直接修改成员变量,但可以通过指针间接修改。
- const 成员函数内不能直接取成员变量地址,但可以通过类型转换进行取地址操作。
const 成员函数定义方式为:
type classname::functioname(...) const;
特殊地,如果需要在 const 函数内调用成员变量的非 const 成员函数,此时可以使用 mutable 关键字声明成员变量解除 const 函数对该成员变量的非 const 成员函数的限制。