编译错误的示例
class Car {
public:
const int &weight()
{
return m_weight;
}
private:
int m_weight;
};
int main(int argc, char *argv[])
{
const Car car;
int weight = car.weight();
return 0;
}
编译后会出现以下错误:
main.cpp:15: error: C2662: “const int &Car::weight(void)”: 不能将“this”指针从“const Car”转换为“Car &”
为什么会这样?
- 编译器里面
constint&weight()
与constint&weight(Car*this)
是等价的; - 因为 Car类的 weight函数虽然没有参数传入,但实际上编译器自动隐含的传入 this指针;
- 由于
constCarcar
被申明为常量实例,导致 car实例所引用的 weight函数的 this指针也需要为 const修饰;
怎么做?
- 将
constint&weight()
改为constint&weight()const
即可
总结
-
constint&weight()const
中,第一个const
修饰weight
返回值,第二个const
修饰this
指针; - 常量类只能访问使用
const
修饰的函数。
网友评论