C ++ - 对const感到困惑

时间:2015-03-22 23:58:07

标签: c++ const

我正在阅读有关const对象http://www.learncpp.com/cpp-tutorial/810-const-class-objects-and-member-functions/的本教程。

我理解const对象只能访问const函数。令我困惑的是当我们将const对象传递给复制构造函数时,它如何访问非const函数?

示例:

class Dog {
     protected:
         string m_name;
         int m_age; 
     public:
         Dog() : m_name("Fido"), m_breed("Corgi"), m_color("Black"), m_age(1) {}
         Dog(const Dog& d) { m_name = d.getName(); m_age = d.getAge(); }
         String getName() { return m_name; }
         int getAge() { return m_age; }
};

因此,当使用const dog对象调用复制构造函数时,该对象如何访问getName()和getAge()函数?

3 个答案:

答案 0 :(得分:3)

const成员函数是一个成员函数,无法修改它被调用的类实例。

因此,如果您有一个const对象,则只能通过在函数原型之后附加const来调用声明为const的函数:

void const_function(int i) const { /* function body */ }
                           ^^^^^

{em} const可以出现唯一的地方,以便创建函数const。其他地方只修改返回类型或参数。


copy constructor只是一个构造函数,它将 const引用作为参数作为相同类型的对象。引用为const,因为构造函数不会修改作为参数传递的对象,它只是从中复制并使用复制的数据构造新对象:

Foo(const Foo& copy_from_this_object) { /* copy member data from argument */ }

此外,复制构造函数实际上并未从其参数复制 const ness ,它只是从中复制所有数据。即论证是const是否为const无关紧要,只是 复制 ,而不是 修改< / EM> 即可。新构建的可能是也可能不是const。它与复制对象的const无关。


编辑 (在OP编辑之后):

  

因此,当使用const dog对象调用复制构造函数时,该对象如何访问getName()和getAge()函数?

无法

这是因为成员函数没有正确标记getName它们应该具有:

getAgeconst 不会修改其类实例。因此它们应该是const!在创建const之后,可以在复制构造函数中的const对象上调用它们,代码将编译正常。

注意:一般情况下,您应始终制作getter {{1}}。这是因为他们的任务应该只是检索有关对象的信息,而不是修改它。

答案 1 :(得分:0)

您只需尝试编译代码,看它不起作用 - 来自ideone.com here

prog.cpp: In copy constructor 'Dog::Dog(const Dog&)':
prog.cpp:13:46: error: passing 'const Dog' as 'this' argument of 'std::string Dog::getName()' discards qualifiers [-fpermissive]
       Dog(const Dog& d) { m_name = d.getName(); m_age = d.getAge(); }
                                              ^
prog.cpp:13:66: error: passing 'const Dog' as 'this' argument of 'int Dog::getAge()' discards qualifiers [-fpermissive]
       Dog(const Dog& d) { m_name = d.getName(); m_age = d.getAge(); }
                                                                  ^

您可以通过制作“获取”功能const

来解决此问题
string getName() const { return m_name; }
int getAge() const { return m_age; }

您可以看到该版本已成功编译here

答案 2 :(得分:0)

<强> It can't

在询问前试试。