3

假设我们有以下代码:

#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]

如何解决?

4

3 回答 3

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指针和引用兼容。

于 2012-09-13T14:00:34.050 回答
1

您还必须将其标记Person::get_a为常量:

class Person
{
    // ...

    int get_a() const;

    // ...
};

这告诉编译器get_a不修改对象。

于 2012-09-13T14:01:25.413 回答
1

const 正确性是病毒式的,你应该从内向外开始(即每个类都应该将不修改对象的成员函数标记为const,允许调用者在 const 对象(或对 const 对象的引用)上使用它们。

于 2012-09-13T14:04:49.233 回答