C++——友元 friend
人类社会的friend VS C++世界的friend
现实世界中,我们自己很多物品,朋友是可以使用的,但是陌生人就不行。那么money,朋友可以随便拿吗?这要是你和friend的关系深浅而定。人类社会friend多多少少还是会有些限制。而C++中的friend才是真正的friend,class中的money(这里指private data可以随便拿)。用法如下

C++ friend具有如下特性:
- friend不是类的成员,但是可以访问class所有成员
- friend不受access level控制
friend机制无疑打破了C++一直强调的封装,这种特性还是少用的好。
相同class的各个object互为friends

为啥重载<<常常设计成friend
老实说,我本身就觉得这种问法很奇怪。难道不设计成class member function,就一定是friend吗?当然不是,你还可以设计成global function啊。当然global function和friend都比class member function要好,为啥?稍后介绍。global function 不如 friend的地方也就是访问private data时,global要通过class“暴露”出来的接口进而访问private data,而friend可以直接拿class 的private data。这在效率上能带来一定的提升。但是在强调封装性的C++中,friend显然是规则破坏者,因此本人更倾向于global 的实现方式。最上面那张图就是global的实现方式。
再说为啥无论global function 还是 friend 都比 class member function好。代码是写给人看的,无论何时都要记得这一点。我们使用cout的时候都是cout<<selfdef_val,而不是seldef_val<<cout。如果设计成class member function就得采用后面这种“非人类”的调用方式。测试代码如下
#include <iostream>
class Complex {
private:
int real;
int img;
public:
Complex(int _real = 0, int _img = 0) :real(_real), img(_img) {}
std::ostream& operator<<(std::ostream& out) {
out << "(" << this->real << "," << this->img << ")";
return out;
}
};
#if 0
ostream& operator<<(ostream& out, const Complex &c) {
out << "(" << c.m_real << "," << c.m_imag << ")";
return out;
}
#endif
int main() {
Complex C1(1, 2);
C1 << std::cout << std::endl;//cout << c << endl;
return 0;
}
C++——友元 friend的更多相关文章
- C++的友元类和友元函数实例
#include <math.h> #include<iostream> using namespace std; class Point { public: Point(do ...
- C++学习笔记 构造&析构 友元 new&delete
构造&析构函数 构造函数 定义:与类同名,可以有参可以无参,主要功能用于在类的对象创建时定义初始化的状态,无返回值,也不能用void修饰,构造函数不能被直接调用,必须通过new运算符在创建对象 ...
- c++友元函数
c++友元函数分两类: 一://友员全居函数 /*#include <iostream>using namespace std;class aaa{ friend void prin ...
- 重载运算符:类成员函数or友元函数
类成员函数: bool operator ==(const point &a)const { return x==a.x; } 友元函数: friend bool operator ==(co ...
- C++之友元
友元提供了不同类的成员函数之间.类的成员函数与一般函数之间进行数据共享的机制.通过友元,一个不同函数或另一个类中的成员函数可以访问类中的私有成员和保护成员.C++中的友元为封装隐藏这堵不透明的墙开了一 ...
- 不可或缺 Windows Native (20) - C++: 友元函数, 友元类
[源码下载] 不可或缺 Windows Native (20) - C++: 友元函数, 友元类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 友元函数 友元类 示例演 ...
- InternalsVisibleToAttribute——把internal成员暴露给指定的友元程序集
友元程序集简介 我们知道一个类中被定义为internal的成员(包括类型.方法.属性.变量.事件)是只能在同一个程序集中被访问到的(当然了,我这里说的是正常的方式,不包括通过反射来访问).这个规则在. ...
- c++ 操作符重载和友元
操作符重载(operator overloading)是C++中的一种多态,C++允许用户自定义函数名称相同但参数列表不同的函数,这被称为函数重载或函数多态.操作符重载函数的格式一般为: operat ...
- [Reprint]C++友元函数与拷贝构造函数详解
这篇文章主要介绍了C++友元函数与拷贝构造函数,需要的朋友可以参考下 一.友元函数 1.友元函数概述: (1)友元函数是定义在一个类外的普通函数.友元函数和普通函数的定义一样;在类内必须将该普通函 ...
- C++——友元、异常和其他
一.友元 类并非只能拥有友元函数,也可以将类作为友元.在这种情况下,友元类的所有方法都可以访问原始类的私有成员和保护成员.另外,也可以做更严格的限制,只将特定的成员函数指定为另一个类的友元.哪些函数. ...
随机推荐
- array_fill 填充数组内容
<?php $a = array_fill(, , 'banana'); $b = array_fill(-, , 'pear'); print_r($a); print_r($b) Array ...
- 常见浏览器CSS hack方法总结
ie6和ie7 #tip {*background:black; /*IE7 背景变黑色*/_background:orange; /*IE6 背景变橘色*/} IE8和IE9 :root .test ...
- [Google] Help employee find the nearest gbike
You are given a campus map with the Google buildings, roads and Google bikes. You have to help the e ...
- C# sqlsugar依赖引用报错的问题解决
English Message : You need to refer to MySql.Data.dll↵Chinese Message : 需要引用MySql.Data.dll,请在Nuget安装 ...
- 【Chrome插件】右键搜--多站点搜索
写在前面:看文章前请先看文章写作时间,避免浪费时间.2019-09-10 使用场景 一次输入,同时在多个网站进行内容搜索,比如一键在不同网站搜索电影.一键获取多个搜索引擎的搜索结果. 操作演示 评分 ...
- Anaconda是什么?Anconda下载安装教程(1)
一.如果从事Python开发,配置环境需要安装两个包: 第一个安装开发工具,俗称IDE : 推荐使用 Pycharm 第二个安装开发工具包: Anaconda ps:Windows 下 Pycharm ...
- 怎样ubuntu下命令行终端显示短路径
参考:http://blog.sina.com.cn/s/blog_b71132f001016cmm.html ubuntu的终端命令行默认是长路径,即把路径深度全部显示出来,操作起来不是很方便,下面 ...
- 【Qt开发】第一个Qt程序Hello World!
一:说在前头 我的第一份工作是做生产工具,当时用的MFC,IDE是VC6.0,现在想想真是古董级别,10年至今,微软也一直没有对MFC进行升级,冥冥中感觉微软自己都放弃MFC了,市场上貌似MFC的岗位 ...
- Python复习笔记01
(1)计算机常识 计算机:硬件(运算器,控制器,存储器,输入设备,输出设备)软件 (系统软件, 应用软件) 二进制 整数存储 文件单 位换算 1Byte = 8bit 1KB = 1024Byte 1 ...
- SAS学习笔记56 ODS ESCAPECHAR
这种内嵌格式独立于style型和table型,它既可以结合二者使用,也可以独立使用.它主要通过下列语句的格式形式来进行调用: ODS ESCAPECHAR ‘^’; 上述符号’^’表示触发条件,如果碰 ...