友元的概念:遵循一定规则而使对象以外的软件系统能够不经过消息传递方式而直接访问对象内封装的数据成员的技术方法便是友元。

只要将外界的某个对象说明为一个类的友元,那么这个外界对象就可以访问这个类对象中的私有成员。

声明为友元的外界对象既可以是另一个类的成员函数,也可以是不属于任何类的一般函数,还可以是整个类(这样,此类中的所有成员函数都成为友元函数)。

1.友元函数

先来一段代码,让大家看看友元函数的用法吧!

#define strmax 32
#include<iostream>
#include<string>
using namespace std;
class myclass
{
int x,y;
char *string;
public:
myclass(int vx,int vy,char *str){
x=vx;
y=vy;
string=new char[strmax];
strcpy(string,str);
}
//friend int sum(myclass c1);
};
int sum(myclass c1)
{
return c1.x+c1.y;
}
int main()
{
myclass c1(,,"my myclass object!");
cout<<"the sum is:"<<sum(c1)<<endl; return ; }

编译结果如下:

Compiling...
friend1.cpp
F:\c++\friend1.cpp(20) : error C2248: 'x' : cannot access private member declared in class 'myclass'
F:\c++\friend1.cpp(7) : see declaration of 'x'
F:\c++\friend1.cpp(20) : error C2248: 'y' : cannot access private member declared in class 'myclass'
F:\c++\friend1.cpp(7) : see declaration of 'y'
Error executing cl.exe.

friend1.exe - 2 error(s), 0 warning(s)

由于对象访问了private成员变量,因此编译会失败!

现在去掉注释,代码如下:

#define strmax 32
#include<iostream>
#include<string>
using namespace std;
class myclass
{
int x,y;
char *string;
public:
myclass(int vx,int vy,char *str){
x=vx;
y=vy;
string=new char[strmax];
strcpy(string,str);
}
friend int sum(myclass c1);
};
int sum(myclass c1)
{
return c1.x+c1.y;
}
int main()
{
myclass c1(,,"my myclass object!");
cout<<"the sum is:"<<sum(c1)<<endl; return ; }

编译通过,而且结果为the sum is:20

2.友元成员

另一个类的成员函数作为某个类的友元,只是在声明友元函数时要加上成员函数所在的类名,称为友元函数。

3.友元类

某个类可以是另一个类的友元,这样作为友元的类中的所有成员函数都可以访问声明其为友元类的类中的全部成员。

c++中友元机制的更多相关文章

  1. java中友元的完美实现(转载)

    http://blog.sina.com.cn/s/blog_ce5b9f7e0102vhiv.html C++中有一个友元机制,可以给予一个类访问另一个类中私有成员的权限.   这个机制有时候是很有 ...

  2. C++中友元简介

    本文基于<C++ Primer(第五版)>,纯属个人笔记整理.若有错误欢迎大家留言指出. 一.为什么要用友元和其缺点? 采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员 ...

  3. C++之友元机制(友元函数和友元类)

    一.为什么引入友元机制? 总的来说就是为了让非成员函数即普通函数或其他类可以访问类的私有成员,这确实破坏了类的封装性和数据的隐蔽性,但为什么要这么做呢? (c++ primer:尽管友元被授予从外部访 ...

  4. C++类的友元机制说明

    下面给出C++类的友元机制说明(对类private.protected成员访问),需要注意的是,友元机制尽量不用或者少用,虽然它会提供某种程度的效率,但会带来数据安全性的问题. 类的友元 友元是C++ ...

  5. MapReduce中作业调度机制

    MapReduce中作业调度机制主要有3种: 1.先入先出FIFO      Hadoop 中默认的调度器,它先按照作业的优先级高低,再按照到达时间的先后选择被执行的作业. 2.公平调度器(相当于时间 ...

  6. [置顶] c++,vc6.0,中友元函数,无法访问私有字段(private)的问题(problem),cannot access private member declared in class 'Date'

    c++,vc6.0,中友元函数,无法访问私有字段(private)的问题(problem),cannot access private member declared in class 'Date' ...

  7. .NET中反射机制的使用与分析

    .NET中反射机制的使用与分析 [日期:2008-06-30] 来源:  作者:志伟     .NET反射的定义:审查元数据并收集关于它的类型信息的能力. 元数据是一种二进制信息,用以对存储在公共语言 ...

  8. java中线程机制

    java中线程机制,一开始我们都用的单线程.现在接触到多线程了. 多线性首先要解决的问题是:创建线程,怎么创建线程的问题: 1.线程的创建: 四种常用的实现方法 1.继承Thread. Thread是 ...

  9. MEF插件系统中通信机制的设计和实现

    MEF插件系统中通信机制的设计和实现 1.背景 一般的WinForm中通过C#自带的Event机制便能很好的实现事件的注册和分发,但是,在插件系统中却不能这么简单的直接用已有的类来完成.一个插件本不包 ...

随机推荐

  1. Spring Webservices(转)

    17.5. Web Services Spring为标准Java web服务API提供了全面的支持: 使用JAX-RPC暴露web服务 使用JAX-RPC访问web服务 使用JAX-WS暴露web服务 ...

  2. wpf根据X与Y轴获取内部值

    效果图: 环境 Visual Studio ,.Net Framework 4.0 SDK 支持Windows XP,Windows Win7.. 实现方法: 创建ListBox设置ListBox.I ...

  3. 背水一战 Windows 10 (56) - 控件(集合类): ListViewBase - 基础知识, 拖动项

    [源码下载] 背水一战 Windows 10 (56) - 控件(集合类): ListViewBase - 基础知识, 拖动项 作者:webabcd 介绍背水一战 Windows 10 之 控件(集合 ...

  4. “全栈2019”Java多线程第三十四章:超时自动唤醒被等待的线程

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  5. Linux启动流程与模块管理(15)

    系统的启动其实是一项非常复杂的过程,因为内核得要检测硬件并加载适当的驱动程序,接下来则必须要调用程序来准备好系统运行的环境,以让用户能够顺利的操作整台主机系统,如果你能够理解系统启动的原理,那么将有助 ...

  6. npm 包 升降版本

    今天用vue-awesome-swiper最新版本遇到些问题,需要调整到2.6.7版本.记录以下. 查看vue-awesome-swiper版本 npm list vue-awesome-swiper ...

  7. Swift 里 Set (三)Inspecting a Set

    isEmpty /// A Boolean value that indicates whether the set is empty. @inlinable public var isEmpty: ...

  8. WebSocket集成XMPP网页即时通讯3:二进制文件收发

    WebSocket支持二进制的发送,见jetty官网: http://www.eclipse.org/jetty/documentation/current/jetty-websocket-api-s ...

  9. django基础之一

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  10. Go语言学习笔记(1)——Hello World!

    第一个go程序——HelloWorld.go 源码 : package main import ("fmt") // import "fmt" func mai ...