友元基本概念:

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. 【原创】驱动枚举之QueryServiceStatus

    BOOL WINAPI QueryServiceStatus( _In_ SC_HANDLE hService, _Out_ LPSERVICE_STATUS lpServiceStatus ); 函 ...

  2. 阿里云CentOS安装配置Python3.7及pip3

    一.安装Python3.7 安装依赖包 yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqli ...

  3. Docker镜像管理基础与基于容器的镜像制作示例

    一.Docker镜像 Docker镜像是启动Docker容器的一个非常重要的组件.Docker各组件之间的关系如图: Docker镜像含有启动容器所需要的文件系统及其内容,因此Docker镜像用于创建 ...

  4. 一张图,让你和面试官聊一个小时的“Java内存模型”

    如果面试官问你:你了解 Java 内存模型吗? 你就可以使用这张图,按照这张图中的顺序和面试官开聊,正常情况下,聊一个小时是差不多的,这个时候,对你的处境是非常有益的,因为面试官的时间不多了.

  5. [转]VS2015 Cordova Ionic移动开发(一)

    本文转自:https://www.cnblogs.com/UltimateAvalon/p/5328642.html 一.Windows环境配置 1.如果已经安装VS2015,打开[工具]-[选项]找 ...

  6. [android] 保存联系人到系统通讯录

    对应着读联系人,把数据写进去,市场上的社交类应用经常会有这样的功能 向raw_contacts表中添加一个id 向data表里面添加对应的数据 获取ContentResolver对象,通过getCon ...

  7. (8)Microsoft office Word 2013版本操作入门_制作传单海报

    1.纸张大小,方向设定. 1.1纸张大小: [页面布局]----[纸张大小] 可以选择已有的尺寸,也可以选择其他自定义的大小. 1.2 方向设定: [页面布局]--[纸张方向]选择 横向或者纵向 2. ...

  8. python爬虫入门urllib库的使用

    urllib库的使用,非常简单. import urllib2 response = urllib2.urlopen("http://www.baidu.com") print r ...

  9. 推荐好用的JavaScript模块

    译者按: 作者将自己常用的JavaScript模块分享给大家. 原文:

  10. Fundebug能够捕获这些BUG

    摘要:Fundebug的JavaScript监控插件更新至0.1.0,可以监控3种不同类型的前端BUG:JavaScript执行错误.资源加载错误.HTTP请求错误. 从简单的onerror开始,Fu ...