友元基本概念:

1,把一个一般函数声明为一个类的友元函数

2,把一个类A的某几个成员函数声明为某个类B的友元函数

3,把一个类A声明为一个类B的友元类。

友元的作用:可以访问类B里所有的成员变量和成员方法,不管是public,protected,还是private。

1,把一个一般函数show声明为一个类的友元函数

#include <iostream>
using namespace std; class Test{
friend void show(const Test &t);
public:
Test(int d = 0) : data(d){}
private:
void fun()const{
cout << "fun:" << data << endl;
}
int data;
}; //友元,即可以访问私有成员变量,也可以访问私有方法
void show(const Test &t){
cout << "friend of Test:" << t.data << endl;
t.fun();
} int main(){
Test t(100);
show(t); return 0;
}

2,把一个类A的fun成员函数声明为类Test的友元函数,但是类A的fun1函数不是类Test的友元函数,所以在fun1里不能够访问Test的私有成员。

#include <iostream>
using namespace std; class Test; class A{
public:
A(int d = 0) : data(d){}
void fun(const Test &t);
void fun1(const Test &t); private:
int data;
}; class Test{
friend void A::fun(const Test &t);
public:
Test(int d = 10) : data(d){}
private:
int data;
}; void A::fun(const Test &t){
cout << t.data << endl;
}
void A::fun1(const Test &t){
//编译不能通过,因为fun1不是class Test的友元函数。
//cout << t.data <<endl;
}
int main(){
Test t(100);
A a;
a.fun(t);
}

3,把类B声明为一个类Test的友元类,因此,类B的所有public成员函数都是类Test的友元函数。

#include <iostream>
using namespace std; class Test; class B{
public:
void fun1(const Test &t);
void fun2(const Test &t);
}; class Test{
friend class B;
public:
Test(int d = 0) : data(d){}
private:
void pri()const{
cout << "pri" << endl;
}
int data;
}; void B::fun1(const Test &t){
cout << t.data << endl;
}
void B::fun2(const Test &t){
t.pri();
} int main(){
Test t(10);
B b;
b.fun1(t);
b.fun2(t);
}

c/c++ 友元基本概念的更多相关文章

  1. C++雾中风景1:友元类与面向对象

    因为后续准备入职的公司都希望能转C++,所以最近也是按部就班的开始进行C++的学习.然后这个系列的文章打算探究C++的语言特性,也比较一下不同语言(如Java,Scala,Python,Go)之间的设 ...

  2. c++中友元机制

    友元的概念:遵循一定规则而使对象以外的软件系统能够不经过消息传递方式而直接访问对象内封装的数据成员的技术方法便是友元. 只要将外界的某个对象说明为一个类的友元,那么这个外界对象就可以访问这个类对象中的 ...

  3. C++_友元3-其他友元关系

    友元和类的关系还可以更复杂. 举个例子,假设出现了交互式遥控器,交互式遥控器能够让您回答电视节目中的问题,如果回答错误,电视将在控制器上产生嗡嗡声. 这个例子的问题,可以使用新的友元关系来解决.我把它 ...

  4. C++Review3_关于C++各种概念的串联与梳理

    经过前面两个Review,对代码复用,类的继承概念有了进一步理解. 这里再做一次复盘,把其他概念也串联起来构成一个知识框架. 首先是类和对象的概念.对象指的是特征与技能的结合体,面向对象编程思想的好处 ...

  5. Objective-C中的类目,延展,协议

    Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上.在其他OOP语言中就没见过这些名词,刚看到这三个名词 ...

  6. PoEduo - C++阶段班【Po学校】-Lesson03-5_运算符重载- 第7天

    PoEduo - Lesson03-5_运算符重载- 第7天 复习前面的知识点 空类会自动生成哪些默认函数 6个默认函数    1  构造  2  析构   3  赋值  4 拷贝构造  5 oper ...

  7. C++一些特殊的类的设计

      一.设计一个只能在栈上分配空间的类 重写类的opeator new 操作,并声明为private,一个大概的代码如下: class StackOnly { public: StackOnly(){ ...

  8. C++ 我想这样用(七)

    话接前篇,继续基于对象编程语法的剩余部分: 6.类的const成员函数和const对象 const数据成员:跟const常量一样,只是一个在类里(而且是在构造函数里),一个在类外而已,都必须初始化. ...

  9. java设计模式---备忘录模式

    一.引子 俗话说:世上难买后悔药.所以凡事讲究个"三思而后行",但总常见有人做"痛心疾首"状:当初我要是--.如果真的有<大话西游>中能时光倒流的& ...

随机推荐

  1. 【MySQL经典案例分析】 Waiting for table metadata lock

    本文由云+社区发表 一. 问题是这样来的 ​ 2018年某个周末,接到连续数据库的告警,告警信息如下: 二. 苦逼的探索过程 1.总体的思路 看到too many connection的报错信息,基本 ...

  2. Java设计模式学习记录-状态模式

    前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使 ...

  3. Spring Cloud Stream如何消费自己生产的消息?

    在上一篇<Spring Cloud Stream如何处理消息重复消费>中,我们通过消费组的配置解决了多实例部署情况下消息重复消费这一入门时的常见问题.本文将继续说说在另外一个被经常问到的问 ...

  4. angularjs_百度地图API_根据经纬度定位_示例

    百度API--Demo地址:   http://lbsyun.baidu.com/jsdemo.htm#i8_4 本例是在angular.js使用的百度地图根据经纬度定位的API:(正常的页面写法基本 ...

  5. [转]Docker(三):Dockerfile 命令详解

    本文转自:https://blog.csdn.net/ityouknow/article/details/79600406 上一篇文章Docker(二):Dockerfile 使用介绍介绍了 Dock ...

  6. sql server查询语句条件判断字段值是否为NULL

    判断字段是否为null select * from table where c is null    select * from table where c is not null 判断字段是否为空 ...

  7. mysql分页存储过程一步一步实现

    1. CREATE DEFINER=`root`@`localhost` PROCEDURE `P_HoverTreePages`( ), ) , ), ), ), IN `SortType` INT ...

  8. nginx配置虚拟机

    在/usr/local/nginx/conf目录下nginx.conf文件是nginx的配置文件. 一.通过端口号区分虚拟机 在nginx.conf文件中添加一个Service节点,修改端口号: se ...

  9. 【Java每日一题】20170314

    20170313问题解析请点击今日问题下方的“[Java每日一题]20170314”查看(问题解析在公众号首发,公众号ID:weknow619) package Mar2017; public cla ...

  10. Netty 系列一(核心组件和实例).

    一.概念 早期的 Java API 只支持由本地系统套接字库提供所谓的阻塞函数来支持网络编程.由于是阻塞 I/O ,要管理多个并发客户端,需要为每个新的客户端Socket 创建一个 Thread .这 ...