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 に答える