总结: const修饰的变量、函数,都不能修改其所在对象相关的内容,包括其成员变量中的内容。
1、const函数参数:
class Base
{
public:
void test() { std::cout<< " test in base\n"; }
};
void MyTest(const Base& b)
{
b.test(); // 这里编译报错,const对象调用非const成员函数。
}
原因: const对象,只能访问该对象的const函数,因为调用其他函数有可能会修改该对象的成员。
编译报错:
error: passing “const Base” as “this” argument of “void Base::test()” discards qualifiers [-fpermissive]。
错误:将参数"const Base"当作参数"this",传递给 "void Base::test()"函数,做为其隐式参数丢弃限定符(const)。
参考资料:
1、gcc编译报 “discards qualifiers [-fpermissive]”
2、成员函数:
class B
{
public:
void func2() { cout << "func2" <<endl; }
};
class A
{
public:
void func1() const { b.func2(); }; //编译错误,const成员函数调用成员变量的非const函数
void func2() const { cout << val2 <<endl; }; // 正确,const成员函数调用非const成员变量但不修改值
int val2 = 2;
B b;
};
原因:const成员函数内可以引用const数据成员,也可以引用非const数据成员,但不能修改非const数据成员的值。但不能调用非const成员函数,也不能调用非const成员变量中的非const成员函数(const到底)。