假设我们有以下代码:
#include <iostream>
class Person{
public:
Person(int age);
int get_a();
private:
int a;
};
Person::Person(int age)
{
a = age;
}
int Person::get_a()
{
return a;
}
void Show_Age(Person P)
{
std::cout<<P.get_a()<<std::endl;
}
int main() {
Person P(10);
Show_Age(P);
return 0;
}
现在假设我们有一个重型对象,我们应该通过引用传递Person,所以我们继续:
void Show_Age(Person &P)
{
std::cout<<P.get_a()<<std::endl;
}
没有问题,但一个好的观察是P应该是const,我们尝试用它:
void Show_Age(const Person &P)
{
std::cout<<P.get_a()<<std::endl;
}
编译器失败:
error: passing ‘const Person’ as ‘this’ argument of ‘int Person::get_a()’ discards qualifiers [-fpermissive]
如何解决?
答案 0 :(得分:12)
您应该标记get_a
const
以便编译:
class Person{
public:
Person(int age);
int get_a() const;
private:
int a;
};
int Person::get_a() const
{
return a;
}
这样做告诉编译器成员函数不会修改对象的状态,使其与const
指针和引用兼容。
答案 1 :(得分:1)
您必须将Person::get_a
标记为不变:
class Person
{
// ...
int get_a() const;
// ...
};
这告诉编译器get_a
不修改对象。
答案 2 :(得分:1)
Const correct-ness是病毒式的,你应该从内向外开始(即每个类应该将不修改对象的成员函数标记为const
,允许调用者在const对象上使用它们(或引用const对象)。