在c++中,友元有三种实现方式:全局函数做友元;类做友元;成员函数做友元;
(这其中,成员函数做友元,大家有许多问题,包括为什么不能在对类内的成员函数定义并通过友元进行访问私有属性。)
(这一切的问题主要是因为:编译器的编译顺序是从上至下,像这种类之间相互使用的用法,一定要先声明使用的类,最后统一实现。这样可以避免了在这一个类中使用那一个类时出现那一类还未定义而报错的情况。)
(下面是我写的成员函数做友元的代码,详细的注释了每一步。)
(特别是关于创建指向类的对象指针,在堆区创建对象这方面,我做了注释,方便大家理解)
- #include
- #include
- using namespace std;
- ///成员函数做友元,成员函数必须写在类外定义,在类内定义会报错。
- class country;//声明这个类(因为USA使用这个函数时,还未定义这个函数)
- class USA
- {
- public:
-
- USA();//默认构造函数
- void visit(); //只让visit函数作为country的好朋友,可以发访问country中私有内容(private)
- void visit2();
- private:
- country *china;//创建一个指向类对象的的指针
- };
- class country
- {
- //告诉编译器 usA类中的visit成员函数 是country好朋友,可以访问私有内容
- friend void USA::visit();//这个是类对象里面的成员函数,可以进行友元
- //friend void visit()是全员函数
- public:
- country();
- public:
- string m_SittingRoom; //公有属性
- private:
- string m_BedRoom;//私有属性
- };
-
- country::country()
- {
- this->m_SittingRoom = "中科院";
- this->m_BedRoom = "核基地";
- }
- USA::USA()
- {
- china = new country;//在堆区创建一个对象
- }
- void USA::visit()
- {
- cout << "美国正在访问" << china->m_SittingRoom << endl;
- cout << "美国正在访问" << china->m_BedRoom << endl;
- }
- void USA::visit2()//这个没有声明友元函数,所以就不能访问私有属性
- {
- cout << "美国正在访问" << china->m_SittingRoom << endl;
- }
- void test01()
- {
- USA gg;//创建一个对象
- cout << "==============" << endl;
- gg.visit();//对象访问这个函数
- cout << "================" << endl;
- gg.visit2();
- }
- int main()
- {
- test01();
- system("pause");
- return 0;
- }