博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ friend 用法汇总
阅读量:6474 次
发布时间:2019-06-23

本文共 3850 字,大约阅读时间需要 12 分钟。

C++这位朋友同意之类的非公共成员的机制是一个类或函数访问,根据朋友的类型分为三种类型:一般非类成员函数为好友,类成员函数为好友。类为好友。

1 内容朋友

包括报表朋友的朋友以及朋友的定义。明默的感觉到声音的朋友extern,的作用域已经扩展到了包括该类定义的作用域。所以即便我们在类的内部定义友元函数也是没有关系的。

2 普通的非成员函数友元

这类友元函数一般是操作符。比如输入输出操作符.示比例如以下所看到的:
//OpeClass.h#pragma onceclass OpeClass{	friend int func(const OpeClass xx);public:	OpeClass(void);	OpeClass(int x,int y);	~OpeClass(void);private:	int width;	int height;};
//OpeClass.cpp#include "OpeClass.h"OpeClass::OpeClass(void){	width = 50;	height = 50;}OpeClass::OpeClass(int x,int y):width(x),height(y){}OpeClass::~OpeClass(void){}int func(const OpeClass xx){	return xx.height * xx.width;}
//main.cpp#include "OpeClass.h"#include 
using namespace std;void main(){ OpeClass XO; cout<

3 类作为友元

类作为友元须要注意的是友元类和原始类之间的相互依赖关系,假设在友元类中定义的函数使用到了原始类的私有变量。那么就须要在友元类定义的文件里包括原始类定义的头文件。
可是在原始类的定义中(包括友元类声明的那个类),就不须要包括友元类的头文件。也不须要在类定义前去声明友元类,由于友元类的声明自身就是一种声明(它指明能够在类外找到友元类),演示样例程序例如以下所看到的:
//A.h#pragma once#include 
using namespace std;class A{ friend class B;public: ~A(void); static void func() { cout<<"This is in A"<
//A.cpp#include "A.h"const A A::Test = A();A::~A(void){}
//B.h#pragma once#include "C.h"class B{public:	B(void);	~B(void);	void func(C& c);};
//B.cpp#include "B.h"#include "A.h"#include "C.h"#include 
using namespace std;B::B(void){}B::~B(void){}void B::func(C& c){ cout<<"This is in B"<
//C.h#pragma onceclass A;class C{public:	C(void);	~C(void);	void func(const A& a);};
//C.cpp#include "C.h"#include 
using namespace std;C::C(void){}C::~C(void){}void C::func(const A& a){ cout<<"This is in C"<
//main.cpp#include "A.h"#include "B.h"#include "C.h"#include 
using namespace std;void main(){ B b; C c; b.func(c); system("pause");}

4 类成员函数作为友元函数

这个略微有点复杂,由于你要类成员函数作为友元,你在声明友元的时候要用类限定符,所以必须先定义包括友元函数的类,可是在定义友元的函数时候。又必须事先定义原始类。通常的做法先定义包括友元函数的类。再定义原始类。这个顺序不能乱。(假设是友元类,则没有这样的这样的必须)如以下所看到的:

//B.h#pragma onceclass A;class B{public:	B(void);	~B(void);	int func(A xx);};
//A.h#pragma once#include "B.h"class A{friend int B::func(A xx);public:	A(void):mx(20),my(30){}	~A(void){}private:	int mx;	int my;};
//B.cpp#include "B.h"#include "A.h"B::B(void){}B::~B(void){}int B::func(A xx){	return xx.mx * xx.my;}
//main.cpp#include "A.h"#include "B.h"#include 
using namespace std;void main(){ A a; B b; cout<
<
5 友元不具有相互性,仅仅具有单项性 若类B是类A的友元。类A不一定是类B的友元,要看在类中是否有对应的声明。

6 友元不能被继承

B是A的友元类。C是B的子类。推不出C是A的友元

7 友元不具有传递性

B是A的友元,C是B的友元,推不出C是A的友元

8 相互为友元的类

这个事实上没什么好注意的,以下是实例。类A,类B互为友元
//A.h#pragma onceclass A{friend class B;public:	A(void);	~A(void);	int funa(B& b);private:	int mx;	int my;};
//A.cpp#include "A.h"#include "B.h"A::A(void){	mx = 10;	my = 10;}A::~A(void){}int A::funa(B& b){	return b.mb * b.mc;}
//B.h#pragma onceclass B{	friend class A;public:	B(void);	~B(void);	int funb(A& a);private:	int mb;	int mc;};
//B.cpp#include "B.h"#include "A.h"B::B(void){	mb = 20;	mc = 20;}B::~B(void){}int B::funb(A& a){	return a.mx *a.my;}
//main.cpp#include "A.h"#include "B.h"#include 
using namespace std;void main(){ A a; B b; cout<
<

9 假设想要指定两个类都有成员函数作为对方的友元,那么必须第2个类是第一个类的友元

//A.h#pragma once// class B is a friend class of Aclass A{	friend class B;public:	A(void):ma(10),mb(20){}	~A(void){}	int funa(B& b);private:	int	ma;	int	mb;};
//B.h#pragma once#include "A.h"// A's function funa is a friend function of Bclass B{	friend int A::funa(B& b);public:	B(void);	~B(void);	int funb(A& a);	int func(A& a);private:	int mx;	int my;};
//A.cpp#include "A.h"#include "B.h"int A::funa(B& b){	return  b.mx * b.my;}
//B.cpp#include "B.h"B::B(void):mx(12),my(15){}B::~B(void){}int B::funb(A& a){	return a.ma + a.mb;}int B::func(A& a){	return a.ma * a.mb;}
//main.cpp#include "A.h"#include "B.h"#include 
using namespace std;void main(){ A a; B b; cout<
<

版权声明:本文博主原创文章。博客,未经同意不得转载。

你可能感兴趣的文章
【故障处理】ORA-12545: Connect failed because target host or object does not exist
查看>>
云时代,程序员将面临的分化
查看>>
js判断移动端是否安装某款app的多种方法
查看>>
学习angularjs的内置API函数
查看>>
4、输出名称 Exported names
查看>>
paste工具
查看>>
Pre-echo(预回声),瞬态信号检测与TNS
查看>>
【转载】如何发送和接收 Windows Phone 的 Raw 通知
查看>>
WCF简要介绍
查看>>
NYOJ 97
查看>>
poj2378
查看>>
【译】SQL Server误区30日谈-Day12-TempDB的文件数和需要和CPU数目保持一致
查看>>
不为技术而技术:大型网站架构演化解析
查看>>
Java文件清单列表
查看>>
js url传值中文乱码之解决之道
查看>>
Atitit.获取某个服务 网络邻居列表 解决方案
查看>>
Trusty TEE
查看>>
[LeetCode] Reverse String 翻转字符串
查看>>
学习iOS【3】数组、词典和集合
查看>>
Hessian 原理分析--转
查看>>