2015-11-14 199 views
1

我目前正在設計一個將引用另一個對象的數據的類。在這個新類中,我試圖傳遞一個對象引用,以便新類可以查看對象的值,而無需複製對象的原始數據。不過,我正在爲此苦苦掙扎。C++將Const對象引用傳遞給構造函數

目前,我有以下類原型:

Force2Motion(const RigidBody& rigid_body); 

所以,當我通過這個引用到構造函數,我想該對象已初始化後,保存這個以備將來使用。因此,我想要某種方式說

RigidBody _memberObject = rigid_body; 

但是,我想避免將所有rigid_body複製到它自己的對象。相反,我以爲這樣就可以創建對象時做這樣的事情

// Force2Motion Member Object 
RigidBody& _rigidBody; 

更合適,然後讓下面的構造

Force2Motion(const RigidBody& rigid_body): 
    _rigidBody(rigid_body) 

但是,這將引發一個錯誤,說,我不是允許分配一個對const引用的引用。我想確保這個新類不會重新分配構造函數的引用,因此我相信我需要const。

我的確意識到,如果我要將成員對象初始化爲一個常量引用,它將允許我運行構造函數,但後來我無法使用任何對象成員函數,因爲編譯器認爲訪問成員函數可能會更改原始對象引用的數據。

這樣的,我有:

const RigidBody& _rigidBody; 

與構造

Force2Motion(const RigidBody& rigid_body): 
     _rigidBody(rigid_body) 

是否有變化,可以到剛體類,這樣我仍然可以使用成員函數進行,即使我已經宣佈了對象爲const?如在,我可以標記某些功能,以便它們表明訪問它們不會更改對象內的任何數據?

感謝您的幫助!

編輯:在我描述問題的過程中,我意識到我應該問的真正問題。因此我很容易找到問題。看看這link。它解釋瞭如果你初始化一個對象爲const,你將無法訪問該對象的任何成員函數,因爲訪問成員函數可能會改變定義爲const的對象內的數據。因此,如果你有一個成員函數,你知道不會改變對象的數據,你需要用一個const關鍵字標記該函數(參考具體的鏈接)。這樣做可以讓你聲明一個對象爲const,但仍然可以訪問某些成員函數。

回答

2

是的,你可以。成員函數可以製成常量

void myFunction() const; 

使用此const使得this指針常量,因此這意味着你不能修改成員變量或調用其他非const成員函數。有一些例外,如const_castmutable關鍵字。但這些應該可以避免。

什麼時候使用這個const的一個很好的簡單例子就是getters。

int getSize() const 
{ 
    return size; 
} 

由於沒有什麼會改變,所以可以在const或非const對象上調用此函數。