2013-03-25 66 views
0

這不破壞封裝嗎?C++:傳遞給非朋友的朋友函數

了Bh:

class B{ 
    int x, y; 
public: 
    B() : x(1), y(1) {} 
    B(const B& obj) : x(obj.x), y(obj.y) {} 

    int getx(); 
    int gety(); 

    friend void pass_private_members(B&); 
}; 

B.cpp

void non_friend_pass_private_members(int& x); 

int B::getx(){ 
    return this->x; 
} 

int B::gety(){ 
    return this->y; 
} 

void pass_private_members(B& obj){ 
    non_friend_pass_private_members(obj.x); 
} 

void non_friend_pass_private_members(int& x){ 
    x++; 
} 

的main.cpp

int main(){ 
    B obj; 
    pass_private_members(obj); 
    cout << obj.getx() << endl; 
    return 0; 
} 
+0

不,也不會從朋友函數的上下文中調用'char *'成員的'strcpy()'。同樣,它不是好友,但來電*是*。友誼賦予與對象相同的特權。所以問問自己:你可以從* objects *成員函數調用'non_friend_pass_private_members()'嗎? – WhozCraig 2013-03-25 04:26:11

+0

「破壞封裝」的含義並不清楚。 – 2013-03-25 04:29:10

+0

@VaughnCato訪問來自非朋友和非會員功能的私人成員 – naxchange 2013-03-25 04:30:23

回答

3

通過聲明friend void pass_private_members(B&)你告訴編譯器,你相信pass_private_members處理的私有成員B。它對私人成員的作用不在於編譯器的關注。這與擁有一個調用non_friend_pass_private_members的成員函數沒有區別。

+1

具有'朋友'功能打破封裝的所有規則。問題是「它是否打破封裝規則」,所以你的回答在這方面並不反映'是'或'否'。 – 2013-03-25 04:38:12

2

它不破壞封裝的規則。但是C++在某種程度上打破了許多「純粹」OOPL的規則。

讓我想起了我最喜歡的C++報價:

C++,在那裏的朋友可以訪問陰部的唯一語言!

+0

啊,但根據這個問題,如果你的朋友想要,他們也可以讓別人這樣做 – naxchange 2013-03-25 04:36:35

+0

我認爲你是正確的,他認爲它正在做什麼。我的評價是,在授予班級友誼時,您授予班級的所有權利成員。因此,通過他的推測(並且通過你的回答,*你的*)*任何*未具體授予的訪問會員數據的友誼正在破壞封裝。這將包括運行時庫函數等,不僅可以從朋友函數中執行,還可以*成員*執行。我恭敬地不同意。你沒有違反任何你明確告訴你的規則,你不需要遵循它們。 – WhozCraig 2013-03-25 04:41:09

+0

@WhozCraig我很欣賞你的見解。 :-) – 2013-03-25 04:42:46