友元函數(shù)可以訪問(wèn)私有成員,但受限制:只能訪問(wèn)當(dāng)前類(不能訪問(wèn)繼承類)的私有成員,且不能直接修改。實(shí)戰(zhàn)中,友元函數(shù)可通過(guò)引用或指針訪問(wèn)私有成員,例如訪問(wèn) student 類的私有成員 name 并打印學(xué)生信息。
C++ 友元函數(shù)詳解:訪問(wèn)私有成員的限制
什么是友元函數(shù)?
友元函數(shù)是不屬于任何類的函數(shù),但可以訪問(wèn)該類中聲明的所有成員(包括私有成員)。友元函數(shù)允許不同類之間的密切交互,并實(shí)現(xiàn)封裝類的靈活使用。
友元函數(shù)訪問(wèn)私有成員的限制
友元函數(shù)訪問(wèn)私有成員時(shí)存在一些限制:
友元函數(shù)只能訪問(wèn)當(dāng)前類的私有成員,不能訪問(wèn)繼承類的私有成員。
友元函數(shù)不能直接修改私有成員。
實(shí)戰(zhàn)案例
假設(shè)我們有一個(gè) Student 類,它有一個(gè)私有成員 name 和一個(gè)公有成員 getAge()。我們創(chuàng)建一個(gè)友元函數(shù) printStudentInfo() 來(lái)訪問(wèn)私有成員 name 并打印學(xué)生信息。
class Student {
private:
string name;
public:
int getAge();
// 聲明友元函數(shù)
friend void printStudentInfo(const Student& student);
};
void printStudentInfo(const Student& student) {
// 可以訪問(wèn)私有成員
cout << "Name: " << student.name << endl;
// 不能修改私有成員
// student.name = "John Doe"; // 錯(cuò)誤
}
int main() {
Student student1;
student1.setName("Jane Doe");
printStudentInfo(student1);
return 0;
}
登錄后復(fù)制
輸出:
Name: Jane Doe
登錄后復(fù)制
在這個(gè)示例中,友元函數(shù) printStudentInfo() 可以訪問(wèn)私有成員 name,但不能修改它。另外,需要注意的是,友元函數(shù)只能通過(guò)引用或指針訪問(wèn)類的成員,不能直接使用對(duì)象成員。






