2012-02-09 64 views
1

我想知道如果一個朋友功能可以更改班級中的私人數據,而不使用指針併發送出該對象的指針,而不使用指針。朋友功能可以更改班級中的私人數據嗎?

我的意思是一個朋友功能有訪問像一個成員函數?

例如:

class myinfo { 
     private: 
      char name[20]; 
      int id; 
      float income;   
     public: 
      void showInfo(void); 
      myinfo(void); 
      friend void updateInfo(myinfo); 

     int main () { 

     myinfo j; 
     updateInfo(j); // calling the friend function 

    return 0; 
} 

    void updateInfo(myinfo c) { 
     strcat(c.name, ":updated"); 
     c.id++; 
     c.income += 1.1; 

回答

6

是的,但不是你寫的吧...如果你想要的功能修改傳入的對象,接受參考而不是價值的方式。 ..

看來你還沒有在C++中學到references

// Declaration of function in class 
friend void updateInfo(myinfo&); 

實施

void updateInfo(myinfo& c) 
{ 
    strcat(c.name, ":updated"); // now modifying passed in instance of c. 
    c.id++; 
    c.income += 1.1; 
} 

順便說一句。在旁註中,傾向於使用std::string並且還了解規則的三個(專爲諸如此類的非平凡類)。

+0

對不起,我已經改變了我的代碼位,這是一個錯誤,我用從我工作的一個例子,但並不真正使任何意義。 – Ali 2012-02-09 00:09:25

+0

你可以給一點解釋或參考的例子嗎?謝謝 – Ali 2012-02-09 00:13:57

+0

@Ali,我沒有得到你的評論,我看到你改變了代碼,但是就目前而言,該函數仍然接受'myinfo'的值,所以'c'是一個副本(默認副本),並且你修改這是暫時的。如果要修改傳入的實例,則需要更改簽名以接受引用... – Nim 2012-02-09 00:14:15

0

是的,原則上,一個類的私有和受保護成員不能從它們聲明的同一類之外訪問。但是,這個規則並不影響朋友。

朋友是用friend關鍵字聲明的函數或類。

如果我們想聲明一個外部函數作爲類的朋友,從而允許這個函數訪問這個類的私有和受保護的成員,我們通過在類中聲明這個外部函數的原型來實現它,並在其前面加上關鍵字friend。

見這裏 - http://www.cplusplus.com/doc/tutorial/inheritance/