在 C 中,友元函數與存取控制可能會衝突。若要存取私有成員,可以將成員宣告為受保護或使用代理函數。例如,Student 類別有私有成員 name 和 score,友元函數 printName 和 printScore 可分別列印這些成員。
C 友元函數與存取控制的衝突
在C 中,友元函數是可以存取類別私有成員的非成員函數。但是,當涉及到存取控制時,友元函數可能會遇到與類別成員存取控制的衝突。
存取控制
C 提供了三種存取控制層級:
友元函數
友元函數是透過 friend
關鍵字宣告的。友元函數可以存取類別的所有成員,無論存取控制層級為何。但是,友元函數不會成為類別的一部分。
存取控制衝突
當友元函數試圖存取私有成員時,就會發生存取控制衝突。例如:
class MyClass { private: int x; friend void printX(MyClass& obj) { std::cout << obj.x << std::endl; } };
在這個範例中,printX
函數是類別的友元,但它試圖存取私有成員 x
。這會導致編譯器錯誤。
解決衝突
要解決存取控制衝突,可以使用下列方法:
1. 使用保護成員
#將私有成員宣告為受保護成員。這允許衍生類別和友元函數存取該成員。
class MyClass { protected: int x; friend void printX(MyClass& obj) { std::cout << obj.x << std::endl; } };
2. 使用代理函數
建立另一個類別成員函數作為私有成員的代理。這個代理函數可以公開訪問,供友元函數使用。
class MyClass { private: int x; public: int getX() const { return x; } friend void printX(MyClass& obj) { std::cout << obj.getX() << std::endl; } };
實戰案例
在以下實際案例中,我們有一個Student
類,它有name
和score
兩個私有成員。我們想要建立兩個友元函數 printName()
和 printScore()
,用來分別列印這些私有成員。
class Student { private: std::string name; int score; friend void printName(Student& obj) { std::cout << "Name: " << obj.name << std::endl; } friend void printScore(Student& obj) { std::cout << "Score: " << obj.score << std::endl; } };
使用友元函數,我們可以輕鬆地列印學生的姓名和成績,即使它們是私有成員。
int main() { Student student; student.name = "John Doe"; student.score = 95; printName(student); printScore(student); return 0; }
輸出:
Name: John Doe Score: 95
以上是C++ 友元函數與存取控制的衝突的詳細內容。更多資訊請關注PHP中文網其他相關文章!