我正在阅读有关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()函数?
答案 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
它们应该具有:
getAge
和const
不会修改其类实例。因此它们应该是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 强>
在询问前试试。