[英]C++ - confused about 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()函數?
const
成員函數是一個成員函數,它不能修改正在被調用的類實例。
因此,如果您有const
對象,則只能通過在函數原型后附加const
來調用聲明為const
的函數:
void const_function(int i) const { /* function body */ }
^^^^^
為了使函數const
,這是const
可以出現的唯一位置 。 其他地方只需修改返回類型或參數即可。
復制構造函數只是將對相同類型對象的const
引用作為參數的const
。 引用是const
因為構造函數不會修改作為參數傳遞的對象,它只是從中復制並使用復制的數據構造新對象:
Foo(const Foo& copy_from_this_object) { /* copy member data from argument */ }
另外,復制構造函數實際上並不從其參數復制const
,而只是從其復制所有數據。 也就是說,參數是否為const
無關緊要,它只是復制而不是修飾 。 新構造的可能是const
也可能不是 。 它有什么做的const
復制的,從對象的湖。
編輯 (在OP編輯之后):
因此,當使用const dog對象調用復制構造函數時,該對象如何訪問getName()和getAge()函數?
它不能 。
這是因為成員函數未正確標記為const
,它們應該在以下位置:
getName
和getAge
不會修改其類實例 。 因此,它們應該是const
! 使它們成為const
,可以在復制構造const
中的const
對象上調用它們,並且代碼可以正常編譯。
注意:通常,您應該始終使getters成為const
。 那是因為他們的任務應該是僅檢索有關對象的信息,而不是對其進行修改。
您只需要嘗試編譯代碼以查看它是否無效-從ideone.com此處 :
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(); }
^
您可以通過使“ get”函數為const
來解決此問題:
string getName() const { return m_name; }
int getAge() const { return m_age; }
您可以在此處看到該版本已成功編譯
不能 。
詢問之前先嘗試一下。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.