C++中友元的三种声明和定义

三种友元:友元函数、友元类、友元成员函数。

声明在类中加上friend,定义在类外,不可加friend、以及类名::。

下面转载一个代码详叙: 

#ifndef A_H
#define A_H
#include <iostream>
using std::cout;
using std::endl;
class B;//前向声明
class A
{
public:
    void dis(const B &b);//只是一个成员函数声明,故B无需现在创建,可以用前向声明 class B;
};
#endif
 
#ifndef B_H
#define B_H
//class A;//因先 #include "A.h" ,再包含 #include "B.h" ,故可以省略前向声明(A已先定义)
class B
{
private:
    int i;
public:
    B(int v):i(v){}
    B():i(0){}
 
 
    //友元声明
    friend void A::dis(const B &a);//其它类的成员函数作为友元函数
    friend void test(const B& b);//普通的非成员函数作为友元函数
};
#endif
#ifndef C_H
#define C_H
class C
{
private: 
    int c;
public:
    C(int v):c(v){}
    friend class D;//友元类,只是一个声明,不作为成员一部分,故无需先创建D的定义
};
#endif
#ifndef D_H
#define D_H
#include <iostream>
using std::cout;
using std::endl;
//class C;//因先 #include "C.h" ,再包含 #include "D.h" ,故此语句可以省略
class D
{
public:
    void dis(const C& c)//dis成员函数定义,这里要用到形参C,故C必须先定义完整,所以先#include "C.h"
    {
        cout<<c.c<<endl;
    }
};
#endif
#include <iostream>
#include "A.h"
#include "B.h"
#include "C.h"
#include "D.h"
using namespace std;
 
 
void A::dis(const B &b)//必须最后定义,因需要两个类完整定义后,才能定义该成员函数
{
    cout<<b.i<<endl;
}
 
void test(const B &b)//普通的非成员函数作为友元函数
{
    cout<<b.i<<endl;
}
 
 
int main()
{
    //其他类的成员函数作为友元函数
    A a;
    B b(9);
    a.dis(b);

    //普通的非成员函数作为友元函数
    test(b);
 
    //友元类举例
    C c(10);
    D d;
    d.dis(c);
 
    system("pause");
    return 0;
}
 

 说明:友元的引入,为了正确地构造类,需要注意友元声明与定义之间的相互依赖。否则会导致编译出错。以上为实例代码,可以借鉴。

猜你喜欢

转载自blog.csdn.net/shenaisi/article/details/81210010
今日推荐