簡體   English   中英

C ++-對const感到困惑

[英]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 ,它們應該在以下位置:

getNamegetAge 不會修改其類實例 因此,它們應該是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM