C++學習--友元
阿新 • • 發佈:2018-11-17
C++的結構體和類均有私有和公有屬性,其實在C++中,結構體和類沒有很大的差別。私有屬性只能在類的內部使用,但C++有提供了一個友元函式,可以在外部訪問類的私有屬性。友元的關鍵詞是friend,即使朋友的意思,就好像朋友能進出你的家一樣。
1.友元函式訪問類或者結構體的屬性
類的私有屬性只能在類的內部訪問,通過public屬性構建的函式可以訪問類的private屬性,但友元函式也可以訪問類的私有屬性,其實這相當於把一個類當做引數傳給了一個函式,然後訪問了類。在操作符過載中,友元函式會頻繁用到。結構體和類是一樣的,類擁有的結構體均有,差別在於結構體預設是公有,類預設是私有。
#include<iostream> class Person { private: int age; float height; public: Person(int, float);//建構函式 friend void get_info(Person &);//宣告一個友元函式,引數是類的引用 }; Person::Person(int age, float height) { this->age = age; this->height = height; } void get_info(Person &p)//一個外部函式 { std::cout << "age=" << p.age << "height=" << p.height << std::endl; } void main() { Person p1(10, 163); get_info(p1);//例項化類後傳進函式 system("pause"); }
如果沒有在類中宣告為友元函式,即使把類當做引數傳入函式也是不能訪問類的屬性的
void print(Person &p)//沒有在類中宣告為友元函式,不能訪問類的私有屬性
{
std::cout << "age=" << p.age << "height=" << p.height << std::endl;
}
2.友元類
宣告為友元類後可以可以訪問朋友類的屬性甚至可以修改,但友元是單向的。例如宣告B是A的友元類,不是說A是B的友元類,並且友元類的關係不能傳遞。
#include<iostream> class Person2;//需要先宣告Person2 class Person { private: int age; float height; public: Person(int, float); friend Person2;//宣告為友元類 }; Person::Person(int age, float height) { this->age = age; this->height = height; } class Person2 { public: Person2(int ,int); }; Person2::Person2(int a,int b) { Person p(10, 163);//例項化一個Person類 std::cout << p.age << p.height << std::endl; p.age = a;//訪問並修改友元類的屬性 p.height = b; } void main() { Person2 p(20, 166);//例項化一個Person2 system("pause"); }