- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章在C++中关于友元函数的进一步理解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
这里重新将类的成员函数的定义看一下:
百科上的认识:
类的成员函数的原型要写在类体中,原型说明了函数的参数表和返回值类型。而函数的定义一般在类外面,也可以直接在类内部定义。前者与普通函数不同的是,实现成员函数时要指明类的名称,具体形式为:
这里在百科上对友元函数的解释:
友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。类授予它的友元特别的访问权。通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你的类时,还要征得其它部分的拥有者的同意).
1.为什么要使用友元函数 。
优点:能够提高效率,表达简单、清晰.
也有缺点:破坏了程序的封装性。有时候不到万不得已的时候才使用.
代码解释:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
#include <iostream>
#include <string>
using
namespace
std;
class
ca {
string id;
void
setId(string s) {
id = s;
}
protected
:
string name;
void
setName(string s) {
name = s;
}
public
:
void
print() {
cout << id <<
" "
<< name <<
" "
<< endl;
}
friend
void
fun(ca& a);
//申明全局函数作友元,允许它访问私有保护成员
};
class
derive :
public
ca { };
//ca类的派生类
void
fun(ca& a) {
//作友元的函数要定义在那个类的后面
a.id =
"987"
;
//这是ca类的私有成员
a.setName(
"xyz"
);
//这是ca类的保护成员
}
int
main ( )
{
ca a;
//a.fun(...); //友元函数不是当前类的成员函数,所以这句编译出错
fun(a);
a.print();
derive d;
fun(d);
//作参数时,类型转换为ca类
d.print();
return
0;
}
|
运行结果:
987 xyz 987 xyz 。
在就是友元函数的位置:可以在类外或者类内 。
声明方式:friend+普通函数声明 。
实现方式:像普通函数那样直接调用 。
还有一点的是:其实一些操作符的重载实现也是要在类外实现的,那么通常这样的话,声明为类的友元是必须滴。(这就像我学的那个坐标类,直接用操作符重载,声明友元函数) 。
最后一个知识点:
友元函数和类的成员函数的区别:
1.成员函数有this指针,而友元函数没有this指针.
2.友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友.
总结 。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我的支持。如果你想了解更多相关内容请查看下面相关链接 。
原文链接:https://blog.csdn.net/qq_39486027/article/details/79595558 。
最后此篇关于在C++中关于友元函数的进一步理解的文章就讲到这里了,如果你想了解更多关于在C++中关于友元函数的进一步理解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有这个: const {ops} = getOplogStreamInterpreter(strm); ops.del.subscribe(v => { console.log('delete
我四处搜索,据我所知,POST 表单请求已被限制为 10MB (http://golang.org/src/net/http/request.go#L721)。 如果我要在我的 ServeHTTP 方
我是一名优秀的程序员,十分优秀!