c++引入友元的原因

在某些情况下,允许特定的非成员函数访问类的私有成员。在类中以关键字friend开始(只能出现在类定义的内部),声明为友元的可以为类、类的成员函数、普通的非成员函数。

速览

#include <iostream>
#include <string>
using namespace std; class b;
class f
{
friend b;
public:
void print_a() { cout << "hello 2013" << endl; }
private:
void print_v() { cout << "hello 2014" << endl; }
}; class b
{
public:
void print_b(f ff)
{
ff.print_a();
ff.print_v();
}
}; int main()
{
f ff;
b bb;
bb.print_b(ff); }

一个具体的例子

#include <iostream>
#include <string>
using namespace std; class Sales_item;
class A {
public:
void fuc(Sales_item &);
}; class Sales_item
{
public:
Sales_item(const string &s = ""): isbn(s){};
friend void A::fuc(Sales_item&);
friend class B;
friend void fuc(Sales_item&);
private:
string isbn;
};
void A::fuc(Sales_item &s)
{cout << "A:" << s.isbn << endl;}
class B
{
public:
void fuc(Sales_item &item)
{
cout << "B:" << item.isbn << endl;
}
};
void fuc(Sales_item &s)
{
cout << "fuc:" << s.isbn << endl;
}
int main()
{
string sval = "abc123";
Sales_item s(sval);
A a;
a.fuc(s); B b;
b.fuc(s); fuc(s);
}

分析
类Sales_item中有个私有成员变量isbn,本来只有通过本类的成员函数可以访问。但是利用友元的机制就可以访问到类的私有成员变量。代码中利用了三种方式:类的成员函数、类、普通的非成员函数。

注意细节

1. 利用类的成员函数访问时。类A必须在Sales_item先定义,而A中的函数A::fuc()的定义必须在Sales_item后定义。

2. 在1中类A必须在Sales_item先定义,会出现Sales_item未定义错误,此时必须在A之前声明一下。

3. Sales_item(const string &s = ""): isbn(s){};  这样,如果形参为引用(或指针),那么只能用列表初始化,而不能用函数体。原因是引用必须马上初始化,如果在函数体内的话,还必须改变引用关联的对象,是不允许的。

4. Sales_item(const string &s = ""): 初始化为“”的话,必须为const,因为不希望通过构造函数改变改变初始值。(尚未完全弄懂,求高人指点)

5. Sales_item(string &s ): 这样的引用。在主函数中这样定义是错误的:Sales_item a("abc");因为“abc"被认为是const对象,是不容许更改的,二传到函数中s是可以改变的。因此如果不希望改变所传的实参的话,最好把函数引用声明为const(否则,会缩小函数的应用范围——不能传递字面值,只可以传递变量名)。因此最好改为Sales_item(const string &s)

【c++】友元的更多相关文章

  1. C++的友元类和友元函数实例

    #include <math.h> #include<iostream> using namespace std; class Point { public: Point(do ...

  2. C++学习笔记 构造&析构 友元 new&delete

    构造&析构函数 构造函数 定义:与类同名,可以有参可以无参,主要功能用于在类的对象创建时定义初始化的状态,无返回值,也不能用void修饰,构造函数不能被直接调用,必须通过new运算符在创建对象 ...

  3. c++友元函数

    c++友元函数分两类: 一://友员全居函数 /*#include <iostream>using namespace std;class aaa{    friend void prin ...

  4. 重载运算符:类成员函数or友元函数

    类成员函数: bool operator ==(const point &a)const { return x==a.x; } 友元函数: friend bool operator ==(co ...

  5. C++之友元

    友元提供了不同类的成员函数之间.类的成员函数与一般函数之间进行数据共享的机制.通过友元,一个不同函数或另一个类中的成员函数可以访问类中的私有成员和保护成员.C++中的友元为封装隐藏这堵不透明的墙开了一 ...

  6. 不可或缺 Windows Native (20) - C++: 友元函数, 友元类

    [源码下载] 不可或缺 Windows Native (20) - C++: 友元函数, 友元类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 友元函数 友元类 示例演 ...

  7. InternalsVisibleToAttribute——把internal成员暴露给指定的友元程序集

    友元程序集简介 我们知道一个类中被定义为internal的成员(包括类型.方法.属性.变量.事件)是只能在同一个程序集中被访问到的(当然了,我这里说的是正常的方式,不包括通过反射来访问).这个规则在. ...

  8. c++ 操作符重载和友元

    操作符重载(operator overloading)是C++中的一种多态,C++允许用户自定义函数名称相同但参数列表不同的函数,这被称为函数重载或函数多态.操作符重载函数的格式一般为: operat ...

  9. [Reprint]C++友元函数与拷贝构造函数详解

    这篇文章主要介绍了C++友元函数与拷贝构造函数,需要的朋友可以参考下   一.友元函数 1.友元函数概述: (1)友元函数是定义在一个类外的普通函数.友元函数和普通函数的定义一样;在类内必须将该普通函 ...

  10. C++——友元、异常和其他

    一.友元 类并非只能拥有友元函数,也可以将类作为友元.在这种情况下,友元类的所有方法都可以访问原始类的私有成员和保护成员.另外,也可以做更严格的限制,只将特定的成员函数指定为另一个类的友元.哪些函数. ...

随机推荐

  1. DNS本机可解析,其他主机通过本机无法解析问题

    新建了一个redhat虚拟机,将此虚拟机作为dns服务器使用,配置完以后宿主机的dns服务器设置为配置好的虚拟机地址,结果总是显示no Server Reached,没有服务器可以到达,花了很长时间终 ...

  2. java.lang.IllegalStateException: Cannot call sendError() after the response has been committed解读

    源代码: @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Ob ...

  3. php对ip地址的处理

    public function actions() { $url = "http://ip.taobao.com/service/getIpInfo.php?ip=".self:: ...

  4. VMware Workstation 14 pro License Keys

    AC5XK-0ZD4H-088HP-9NQZV-ZG2R4 CG54H-D8D0H-H8DHY-C6X7X-N2KG6 ZC3WK-AFXEK-488JP-A7MQX-XL8YF ZC5XK-A6E0 ...

  5. [转] 红帽7搭建Zabbix监控

    zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位/解决 ...

  6. Jmeter之线程组详解

    hello,更新几天的分享,线程数现在才分享,感觉怪怪的,原谅我没有考虑到一个顺序问题哈,那里总结好了,我就发那里,先把组件都写完,再来项目实战,希望大家不要责怪哈,内容有写的不详细的,或者我说错了, ...

  7. 机器学习笔记(四)--sklearn数据集

    sklearn数据集 (一)机器学习的一般数据集会划分为两个部分 训练数据:用于训练,构建模型. 测试数据:在模型检验时使用,用于评估模型是否有效. 划分数据的API:sklearn.model_se ...

  8. STM32-RTC实时时钟-毫秒计时实现

    OS:Windows 64 Development kit:MDK5.14 IDE:UV4 MCU:STM32F103C8T6 1.RTC时钟简介 STM32 的实时时钟(RTC)是一个独立的定时器, ...

  9. js 实现星级评分

    最近的项目中有一个星级评分的需求,  自己就写了一下, 由于可能一个页面要用到多个,就采用了面向对象的写法. 用到的png图片也放到这里.    js要用到jquery. css: .sr-star{ ...

  10. Q64 最小路径和

    给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [1,3,1], [1,5,1], ...