const成员函数
类的成员函数后边增加一个 const 关键字,表示该函数为 const 成员函数。考虑如下类A的定义,f1为 const 成员函数,f2为 非const 成员函数:
class A{
public:
A(int i) : m_id(i) {}
void f1() const; // const 成员函数
void f2(); // 非const 成员函数
private:
int m_id;
};
在 const 成员函数中不能修改类的成员变量,如下代码会导致编译失败:
void A::f1() const
{
m_id = 1; // 编译失败!不能修改类的成员变量
}
此外,类的 const 对象,只能访问其 const 成员函数,如下代码中只有对 f2 的调用会导致编译失败:
const A a(1);
a.f1(); // 编译成功
a.f2(); // 编译失败,不能访问非 const 成员函数
const成员变量
非静态 const 成员变量需要通过初始化列表进行初始化。静态 const 成员变量通过显示的定义进行初始化。
class A{
public:
A(int i) : m_id(i){} // 非静态 const 成员变量通过初始化列表初始化
private:
const int m_id;
static const int s_id;
};
const int A::s_id = 1; // 静态 const 变量通过显示的定义进行初始化
const指针
const指针定义时,根据 const 关键字和 * 的位置,可以分成两种情况。
char buf[4] = "abc";
const char* p1 = buf;
char const* p2 = buf;
char* const p3 = buf;
例如上面的代码中,p1和p2表示的含义相同(const 关键字在 * 的左边),表示指针指向的内容是 const 的,但指针本身是 非const。p3 (const 关键字在 * 的右边)表示指针本身是const的,但其指向的内容是 非const。
char c = 'd';
p1[0] = c; // 编译失败,其指向的内容是const的,不能修改
p2[0] = c; // 编译失败
p1 = &c; // 编译成功
p2 = &c; // 编译成功
p3[0] = c; // 编译成功
p3 = &c; // 编译失败,指针本身是const的,不能修改