2012-09-13 68 views
3

假设我们有下面的代码:引用问题传递const对象

#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; 
} 

现在假设我们有一个沉重的物体,我们应该通过引用传递的人,所以我们继续:

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

为什么不做个'Show_Age'一个成员函数? – jrok

+0

因为它是一个测试功能,实际上我有另一个类,并使用获得的功能函数,所以类中我有一个向量,所以我需要通过引用传递一个对象 – FacundoGFlores

回答

12

你应该标记,以便get_aconst此编译:

class Person{ 
public: 
    Person(int age); 
    int get_a() const; 
private: 
    int a; 
}; 

int Person::get_a() const 
{ 
    return a; 
} 

否则告诉的成员函数不修改对象的状态,编译器,使其兼容const指针和引用。

1

你必须标记Person::get_a为常数,以及:

class Person 
{ 
    // ... 

    int get_a() const; 

    // ... 
}; 

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

1

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

+0

谢谢,这是一个很好的建议。让我看看,你是建议我:我应该得到重载的get函数,以允许类的用户正确使用类作为他们希望如何? – FacundoGFlores

+1

@facunvd:稍微多一点一般意义上,我们不是在谈论重载,而是每个功能。一个不修改对象状态的函数应该是'const'(它是** const,但你应该这样标记它)。添加'const'关键字意味着编译器和你一样知道:'get_a'不会修改对象。没有它,编译器不知道它,并且不允许你在const对象上调用该函数。 –