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++——友元、异常和其他
一.友元 类并非只能拥有友元函数,也可以将类作为友元.在这种情况下,友元类的所有方法都可以访问原始类的私有成员和保护成员.另外,也可以做更严格的限制,只将特定的成员函数指定为另一个类的友元.哪些函数. ...
随机推荐
- JAVA协程 纤程 与Quasar 框架
ava使用的是系统级线程,也就是说,每次调用new Thread(....).run(),都会在系统层面建立一个新的线程,然鹅新建线程的开销是很大的(每个线程默认情况下会占用1MB的内存空间,当然你愿 ...
- 13点睛Spring4.1-Spring EL
13.1 Spring EL Spring EL-Spring表达式语言,支持在xml和注解中使用表达式,类似jsp的EL表达式语言; 本教程关注于在注解中使用Spring EL; Spring EL ...
- 打印格式化printf
#define _DEBUG_ #ifdef _DEBUG_#define printm(fmt, ...) do { printf("%s line %d, "fmt, __f ...
- DeviceEventEmitter React-Native 发送和接受消息(事件监听器)
A页面注册通知: import {DeviceEventEmitter} from 'react-native'; //… //调用事件通知 DeviceEventEmitter.emit('xxxN ...
- 八皇后问题——列出所有的解,可推至N皇后
<数据结构>--邓俊辉版本 读书笔记 今天学习了回溯法,有两道习题,一道N皇后,一道迷宫寻径.今天,先解决N皇后问题.由于笔者 擅长java,所以用java重现了八皇后问题. 注意是jav ...
- SQL语言(一)
数据定义语言:简称DDL(Data Definition Language) create database 数据库名 character set 'utf-8'; drop database 数据库 ...
- 剑指offer55:链表中环的入口结点
1 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 2 思路和方法 这是一个典型的链表中查找环的问题,基本思路是,首先设置两个快慢指针slow和fast,并且快指 ...
- HCIA SWITCHING&ROUTTING 笔记——第一章 TCP/IP基础知识(1)
视频地址:https://ilearningx.huawei.com/courses/course-v1:HuaweiX+EBGTC00000336+Self-paced/courseware/abb ...
- AJAX个人草稿
/*var CUSTOMS_SEX=arr[2]; var CUSTOMS_TELEPHONE=arr[6]; mui.openWindow({ url:'userinfol.html', id:'u ...
- Java CountDownLatch应用
Java的concurrent包里面的CountDownLatch其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是同时只能有一个线程去减这个计数 ...