对于 const Fred * p
来说, p是一个指针, 指向了一个 常量Fred. 假设Fred 类有一个叫做 inspect() 的 const 成员函数,那么写 p->inspect() 是可以的。但如果 Fred 类有一个非 const 成员函数 mutate() ,那么写 p->mutate() 就是个错误(编译器会捕获这种错误;不会在运行时测试;因此 const 不会降低运行速度)。
也就是说const对象只能调用const方法。
同理, const引用也是这样, 比如const Fred & x
, x也只能调用const方法。
那什么是const成员函数。 就是这个函数只能访问 成员属性, 不能修改成员属性。
class Fred {
public:
void inspect() const; // 该成员保证不修改*this
void mutate(); // 该成员可能会修改*this
};
void userCode(Fred& changeable, const Fred& unchangeable)
{
changeable.inspect(); // 正确:没有修改一个可修改对象
changeable.mutate(); // 正确:修改一个可修改对象
unchangeable.inspect(); // 正确:没有修改一个不可修改对象。
unchangeable.mutate(); // 错误:试图修改一个不可修改对象。
}
const方法可以有 const对象 和 非const 对象调用, 但是 const对象只能调用 const 方法。
const重载, 同名的const方法和非const方法是重载的, 比如
class Fred { ... };
class MyFredList {
public:
const Fred& operator[] (unsigned index) const; ←下标运算符通常成对出现
Fred& operator[] (unsigned index); ←下标运算符通常成对出现...
};
同理, 对于参数来说, const参数和非const参数也不是同一个类型, 比如 const std::string
和 std:string
就不是同一个类型
const Fred *p有什么含义, p是一个指针, 指向一个 const对象Fred, p只能调用 Fred 的 const 成员方法。同理
const Fred* p 表明 p 指向一个 const 的 Fred 对象—— Fred 对象不能通过 p 修改。
Fred* const p 表明 p 是一个指向 Fred 对象的 const 指针——可以通过 p 修改 Fred 对象,但不能修改 p 本身。
cosnt Fred* const p 表明“ p 是一个指向 const Fred 对象的 const 指针”——不能修改 p ,也不能通过 p 修改 Fred 对象。
18.6 “ const Fred& x ”是什么意思?
mutable和 const_cast方法
如果 const 方法也想要改变成员属性, 这个属性必须是 mutable 的, 但是由于不是所有的编译器都支持mutable 这个关键字, 所以最好不要使用。
const_cast
const成员函数, 就是在参数列表之后增加一个const限定, 该成员函数可以由const对象和 非const对象调用,该成员函数确保不会修改成员属性。
const对象只能调用const成员函数, 不能调用非const成员函数。
网友评论