2015-11-07 36 views
0

我有下面的類:在類範圍外聲明的函數,但不是朋友。這個怎麼用?

class PhoneCall{ 
private: 
    string number; 
public: 
    /*some code here */ 
}; 

現在,我宣佈一個函數(不朋友PhoneCall),做一些具體的操作,並返回一個PhoneCall對象

PhoneCall callOperation() 

另一個需要PhoneCall對象作爲參數

void userCall(PhoneCall obj) 

我一直在期待它不工作,除非它被明確地聲明爲該類的朋友。

爲什麼和如何做到這些功能工作,即使他們不是朋友PhoneCall類?

A friend function of a class is defined outside that class' scope but it has the right to access all private and protected members of the class http://www.tutorialspoint.com/cplusplus/cpp_friend_functions.htm

+0

在您看來:PhoneCall的哪些私有或受保護的成員會執行'userCall()'要求? – fukanchik

+1

如果不是'PhoneCall',而是使用'std :: string'類型聲明這些函數,那麼您是否需要函數與'std :: string'成爲朋友? – wil93

+3

'一個類的朋友函數在該類的範圍之外定義,但它有權訪問該類的所有私有和受保護成員。它並沒有說非友元函數不能返回或作爲該類的一個對象的參數。 – 101010

回答

5

可以傳遞,處理並返回一個類的實例,而不beeing的朋友,只要你不訪問其私有或受保護成員

根據N4296。頁。 261

11.3 Friends

A friend of a class is a function or class that is given permission to use the private and protected member names from the class.

除非你宣佈你的移動或複製構造爲私有或保護的目的也可以複製或移動作爲一個整體。

所以實際上是一個privatePhoneCall構造將防止非朋友實例PhoneCall對象:

例如:

class PhoneCall{ 
    private: PhoneCall(){} 
}; 

這可以防止非友代碼實例化類:

PhoneCall callOperation(){ 
    return PhoneCall(); 
} 

將導致編譯時錯誤:

error: 'PhoneCall::PhoneCall()' is private 

編輯:在下面的評論M.M`s建議私有構造函數添加信息。

+0

也許OP是忽略了它是**成員的名稱**,它可能不會在非朋友代碼中使用。該對象可能仍然作爲一個整體進行復制,或讓這些成員以不涉及該名稱出現的其他方式進行訪問。 –

+0

@ M.M感謝您指出這一點。我剛剛添加了關於構造函數的一個句子。 –

相關問題