热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++中友元机制的详解与特性

本文深入探讨了C++中的友元机制,包括外部函数友元、成员函数友元和类友元。友元打破了对象的封装性,赋予特定实体访问私有成员的能力。

在 C++ 中,友元机制允许某些特定的函数或类访问另一个类的私有和保护成员,尽管这会破坏对象的封装性。友元可以分为三种类型:外部函数友元、成员函数友元和类友元。

### 1. 外部函数友元

当需要让一个外部函数访问某个类的私有成员时,可以将该函数声明为友元函数。例如:

class Int { private: int value; public: Int(int x = 0) : value(x) {} ~Int() {} friend void fun(Int &it); }; void fun(Int &it) { it.value = 10; }

需要注意的是,作为外部函数,它没有隐含的对象指针(即 this 指针),因此无法通过对象来讨论其可访问性。

### 2. 成员函数友元

如果希望一个类的成员函数能够访问另一个类的私有成员,可以通过声明成员函数友元实现。示例如下:

class Int; class Object { public: void fun(Int &it); }; class Int { private: int value; public: Int(int x = 0) : value(x) {} ~Int() {} friend void Object::fun(Int &it); // 告诉编译器这是 Object 类的成员函数 }; void Object::fun(Int &it) { it.value = 100; } int main() { Object obj; Int a(0); obj.fun(a); return 0; }

这里的关键是必须明确指出哪个类的成员函数是友元。

### 3. 类友元

类友元允许一个类的所有成员函数访问另一个类的私有成员。例如:

class Int; class Object { public: void fun(Int &it); }; class Int { friend class Object; private: int value; public: Int(int x = 0) : value(x) {} ~Int() {} }; void Object::fun(Int &it) { it.value = 100; }

总结来说,友元具有以下特点:

  • 单向性:只有被声明为友元的函数或类才能访问私有成员。
  • 不传递性:即使 A 是 B 的友元,B 也不是 A 的友元。
  • 不继承性:派生类不会自动继承基类的友元关系。

推荐阅读
  • 20100423:Fixes:更新批处理,以兼容WIN7。第一次系统地玩QT,于是诞生了此预备式:【QT版本4.6.0&#x ... [详细]
  • 在Java中,this是一个引用当前对象的关键字。如何通过this获取并显示其所指向的对象的属性和方法?本文详细解释了this的用法及其背后的原理。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 本文详细介绍了如何在 Objective-C 中使用 @public 和 @protected 修饰符来控制类成员的访问权限。同时,探讨了点语法和箭头操作符的区别,以及属性声明和实现的自动生成。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文详细介绍了Java中的输入输出(IO)流,包括其基本概念、分类及应用。IO流是用于在程序和外部资源之间传输数据的一套API。根据数据流动的方向,可以分为输入流(从外部流向程序)和输出流(从程序流向外部)。此外,还涵盖了字节流和字符流的区别及其具体实现。 ... [详细]
  • 2018年3月31日,CSDN、火星财经联合中关村区块链产业联盟等机构举办的2018区块链技术及应用峰会(BTA)核心分会场圆满举行。多位业内顶尖专家深入探讨了区块链的核心技术原理及其在实际业务中的应用。 ... [详细]
  • 本文详细介绍了C语言中的指针,包括其基本概念、应用场景以及使用时的优缺点。同时,通过实例解析了指针在内存管理、数组操作、函数调用等方面的具体应用,并探讨了指针的安全性问题。 ... [详细]
  • C语言标准及其GCC编译器版本
    编程语言的发展离不开持续的维护和更新。本文将探讨C语言的标准演变以及GCC编译器如何支持这些标准,确保其与时俱进,满足现代开发需求。 ... [详细]
  • 本文探讨了如何使用自增和自减运算符遍历二维数组中的元素。通过实例详细解释了指针与二维数组结合使用的正确方法,并解答了常见的错误用法。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 如何使用PyCharm及常用配置详解
    对于一枚pycharm工具的使用新手,正确了解这门工具的配置及其使用,在使用过程中遇到的很多问题也可以迎刃而解,文中有非常详细的介绍, ... [详细]
  • 本文详细介绍了 org.apache.commons.io.IOCase 类中的 checkCompareTo() 方法,通过多个代码示例展示其在不同场景下的使用方法。 ... [详细]
  • 在Oracle数据库中,使用Dbms_Output.Put_Line进行输出调试时,若单行字符超过255个,则会遇到ORA-20000错误。本文介绍了一种有效的方法来处理这种情况,通过创建自定义包和视图,实现对长字符串的分割和正确输出。 ... [详细]
  • 本文详细介绍了C语言的起源、发展及其标准化过程,涵盖了从早期的BCPL和B语言到现代C语言的演变,并探讨了其在操作系统和跨平台编程中的重要地位。 ... [详细]
author-avatar
shaka14
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有