c++怎么使用friend友元函数和友元类_c++ friend函数与友元类使用方法

友元函数和友元类可访问私有成员,用于操作符重载等场景;友元函数非成员函数,用friend声明;友元类所有成员可访问目标类私有成员,关系单向;成员函数亦可作友元,需前置声明;友元不继承、不传递,应谨慎使用以维护封装性

c++怎么使用friend友元函数和友元类_c++ friend函数与友元类使用方法

在C++中,友元函数友元类是一种特殊的机制,允许外部函数或另一个类访问当前类的私有(private)和保护(protected)成员。这打破了封装性,但某些场景下非常实用,比如操作符重载、两个类紧密协作等。

友元函数的使用方法

友元函数不是类的成员函数,但它可以访问类的所有成员,包括 private 和 protected 成员。要在类中声明一个友元函数,使用 friend 关键字。

示例:定义一个友元函数来输出类的私有数据

#include using namespace std;class MyClass {private:    int secret;public:    MyClass(int s) : secret(s) {}    // 声明友元函数    friend void showSecret(const MyClass& obj);};// 友元函数定义,可以访问 MyClass 的私有成员void showSecret(const MyClass& obj) {    cout << "Secret value: " << obj.secret << endl;  // 直接访问 private 成员}int main() {    MyClass obj(42);    showSecret(obj);  // 输出: Secret value: 42    return 0;}

注意:友元函数定义在类外,不加 friend 前缀;它也不是类的成员,因此不能通过对象调用(除非作为普通函数),也不能使用 this 指针。

友元类的使用方法

如果一个类被声明为另一个类的友元类,那么这个友元类的所有成员函数都可以访问原类的私有和保护成员。

立即学习“C++免费学习笔记(深入)”;

示例:Box 类允许 Storage 类访问其私有成员

#include using namespace std;class Box {private:    double width;public:    Box(double w) : width(w) {}    // 声明 Storage 类为友元类    friend class Storage;};class Storage {public:    void printWidth(const Box& box) {        cout << "Box width: " << box.width << endl;  // 访问 Box 的 private 成员    }};int main() {    Box box(10.5);    Storage storage;    storage.printWidth(box);  // 输出: Box width: 10.5    return 0;}

注意:友元关系是单向的。上面的例子中,Storage 可以访问 Box,但 Box 不能访问 Storage 的私有成员,除非反过来也声明友元。

友元函数作为全局函数或成员函数

除了全局函数,友元也可以是一个其他类的成员函数。这时需要先声明类,再定义成员函数,并在目标类中用 friend 声明该函数。

示例:将一个类的成员函数设为另一个类的友元

#include using namespace std;class Target;  // 提前声明class Helper {public:    void assist(const Target& t);  // 成员函数声明};class Target {private:    int value;public:    Target() : value(100) {}    // 声明 Helper::assist 为友元函数    friend void Helper::assist(const Target&);};// 定义友元成员函数void Helper::assist(const Target& t) {    cout << "Accessing private value: " << t.value << endl;}int main() {    Target t;    Helper h;    h.assist(t);  // 输出: Accessing private value: 100    return 0;}

关键点:必须确保编译器能识别 Target 类和 Helper::assist 函数的声明顺序,通常需要前置声明。

使用注意事项与建议

友元破坏了封装性,应谨慎使用,仅在必要时(如运算符重载、工厂模式、调试工具)才使用。友元关系不能被继承。基类的友元不能访问派生类的私有成员。友元关系不具备传递性。A 是 B 的友元,B 是 C 的友元,不代表 A 能访问 C 的私有成员。尽量避免滥用友元,优先考虑公有接口设计。

基本上就这些。合理使用 friend 能提升灵活性,特别是在实现 IO 流操作符(如 operator)时非常常见。

以上就是c++++怎么使用friend友元函数和友元类_c++ friend函数与友元类使用方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1479039.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 03:26:52
下一篇 2025年12月11日 07:02:56

相关推荐

  • c++怎么定义和使用一个类_c++类定义与使用方法

    类是C++面向对象编程的核心,用于封装数据和函数。1. 使用class定义类,包含private和public成员;2. 成员函数通过作用域解析符::在类外实现;3. 创建对象并调用公有函数操作数据;4. 构造函数用于初始化对象。例如Student类定义私有属性id、name,公有函数setInfo…

    好文分享 2025年12月19日
    000
  • c++中extern "C"有什么作用_extern "C"实现C++与C混合编程

    extern “C”用于使C++编译器以C语言链接方式处理函数,避免名字修饰,实现C与C++混合编程时的符号兼容。 在C++程序中,extern “C” 的主要作用是告诉C++编译器:对指定的函数或变量使用C语言的链接方式(linkage)进行编译和链…

    2025年12月19日
    000
  • c++中头文件和源文件的区别_c++头文件与源文件作用解析

    头文件声明接口,源文件实现功能。头文件包含类、函数声明,通过#include引用并防止重复包含;源文件实现具体逻辑,独立编译后链接,提升编译效率与代码复用性。 在C++编程中,头文件(.h 或 .hpp)和源文件(.cpp)各有不同职责,合理使用它们能提升代码的可读性、复用性和编译效率。理解两者区别…

    2025年12月19日
    000
  • c++中explicit关键字的作用_c++ explicit关键字用法详解

    explicit关键字用于禁止隐式类型转换,提高代码安全;它作用于单参数构造函数或转换运算符,防止编译器自动执行非预期的转换,如int转对象或指针转bool,必须显式调用才能转换。 在C++中,explicit关键字主要用于修饰类的构造函数,防止编译器进行隐式类型转换。这个关键字的作用是避免一些非预…

    2025年12月19日
    000
  • c++中如何实现二分搜索_c++二分搜索实现方法

    二分搜索要求容器有序,通过比较中间值缩小范围,时间复杂度O(log n)。可用递归或迭代实现,推荐迭代以节省栈空间。C++ STL提供binary_search、lower_bound和upper_bound等函数,实际开发建议优先使用STL版本,更安全高效。 在C++中实现二分搜索,前提是数组或容…

    2025年12月19日
    000
  • c++怎么实现运算符[]的重载_c++运算符[]重载方法

    运算符[]可作为类成员函数重载,用于自定义容器的元素访问;需提供非常量和常量两个版本,返回引用以支持赋值,并进行边界检查。 在C++中,运算符[] 可以通过类的成员函数进行重载,常用于实现自定义容器类(如数组、向量、映射等)的元素访问功能。由于 [] 是一个二元操作符,但作为类成员函数重载时,它只接…

    2025年12月19日
    000
  • c++中mutable关键字是什么意思_c++ mutable成员变量用法说明

    答案:mutable允许const成员函数修改特定成员变量。它用于缓存、计数等不影响对象逻辑状态的场景,如示例中compute()函数修改mutable变量cache_valid和cached_result以实现延迟计算,保持const正确性的同时提升性能。 在C++中,mutable 是一个用于修…

    2025年12月19日
    000
  • c++中map和unordered_map怎么选择_c++ map与unordered_map对比

    map基于红黑树实现,元素有序,操作时间复杂度为O(log n);unordered_map基于哈希表,无序,平均O(1),最坏O(n)。2. 若需有序遍历或范围查询选map。3. 若仅需高效查找且哈希良好,选unordered_map。4. map对键只需比较操作,unordered_map需哈希…

    2025年12月19日
    000
  • c++中怎么格式化输出字符串_c++字符串格式化输出技巧

    C++中格式化输出字符串有多种方法:①使用std::cout与 在C++中格式化输出字符串,有多种方式可以实现,每种方法各有特点,适用于不同场景。下面介绍几种常用的字符串格式化输出技巧,帮助你更灵活地处理输出内容。 使用 std::cout 与操作符 这是最基础也是最常见的输出方式,适合简单拼接和输…

    2025年12月19日
    000
  • c++怎么在运行时动态加载类_c++运行时动态加载类方法

    答案:C++通过动态链接库和工厂模式实现类的动态加载。将类定义在公共头文件中,动态库实现类并导出创建函数,主程序使用dlopen/dlsym加载库和获取函数指针,进而创建对象。示例展示了Linux下基于MyInterface接口、MyClass实现及create_object工厂函数的插件式架构,需…

    2025年12月19日
    000
  • c++怎么定义一个函数指针_c++函数指针定义与使用示例

    函数指针是C++中指向函数的指针变量,用于存储函数地址并调用函数,支持回调机制与动态调用。定义语法为“返回类型 (指针名)(参数列表)”,如int (funcPtr)(int, int);可指向符合签名的函数,通过赋值改变目标函数实现不同行为,常用于回调函数、函数表等场景,是理解STL函数对象与la…

    2025年12月19日
    000
  • c++中什么是左值和右值_c++左值右值及引用折叠的理解

    左值有地址可取,右值为临时值;C++11细分右值为纯右值和将亡值;右值引用绑定右值并支持移动语义;引用折叠规则实现完美转发。 在C++中,左值(lvalue)和右值(rvalue)是表达式分类的基础概念,直接影响变量的使用方式、引用绑定规则以及移动语义的设计。理解它们对掌握现代C++(尤其是C++1…

    2025年12月19日
    000
  • c++中constexpr和const有什么本质区别_c++ constexpr与const区别详解

    constexpr 要求编译时求值,const 仅保证不可变;例如 constexpr 可用于数组大小,而 const 若依赖运行时初始化则不能。 constexpr 和 const 在 C++ 中都用于表示“不可变”,但它们的本质区别在于: const 表示运行时或编译时的只读性,而 conste…

    2025年12月19日
    000
  • c++中怎么获取当前时间_c++获取系统时间方法

    使用 time() 获取秒级时间,适合基础场景;std::chrono 提供毫秒、微秒级精度,推荐用于高精度需求;gettimeofday() 适用于 Linux/Unix 系统获取微秒时间,但不具备跨平台性。 在C++中获取系统时间有多种方法,根据精度需求和平台兼容性可以选择不同的方式。以下是几种…

    2025年12月19日
    000
  • c++中如何使用可变模板参数_c++可变模板参数用法

    可变模板参数允许函数和类接受任意数量和类型的参数,通过…定义模板和函数参数包,使用递归或初始化列表展开参数,结合sizeof…获取参数数量,利用std::forward实现完美转发,常用于实现泛型日志、工厂函数等工具。 在C++11中引入了可变模板参数(variadic te…

    2025年12月19日
    000
  • c++如何定义和使用宏(macros)_c++宏定义与使用技巧

    宏通过#define定义,如#define MAX_SIZE 100定义常量,#define MAX(a,b) ((a)>(b)?(a):(b))实现带参替换,常用于常量定义、代码简化、条件编译和跨平台适配,结合#进行字符串化,##拼接符号,需注意括号防优先级错误、避免副作用,推荐用const…

    2025年12月19日
    000
  • c++怎么使用printf风格的格式化输出_c++ printf格式化输出方法

    C++中使用printf需包含,通过格式字符串控制输出,支持%d、%f、%s等格式符,可指定宽度对齐如%10d,注意类型匹配与避免格式化漏洞,推荐用%s输出std::string的c_str()。 在C++中使用printf风格的格式化输出,主要依赖于C标准库中的头文件。虽然C++推荐使用std::…

    2025年12月19日
    000
  • c++中模板(template)的基本用法_c++模板编程基础教程

    模板是C++泛型编程的核心,通过template定义函数和类模板实现类型无关的通用代码。例如,函数模板max可自动推导或显式指定类型实例化;类模板如Array支持类型与非类型参数,用于构建通用数据结构。模板在调用时才实例化,定义需放在头文件中以避免链接错误。支持多参数及默认值,如PairArray可…

    2025年12月19日
    000
  • c++怎么使用位域(bit-field)来节省内存_c++位域结构定义与内存优化

    位域通过将多个小整数或标志压缩到同一存储单元中节省内存。例如,用unsigned int flag:1;定义仅占1位的成员,相比传统布尔或整型变量大幅减少空间占用,适用于嵌入式系统、协议解析等场景。结构体NewStatus使用位域后比未使用的OldStatus从约10字节降至2~4字节。但位域不可取…

    2025年12月19日
    000
  • c++ auto关键字有什么好处_c++ auto关键字作用解析

    auto 关键字在C++11中用于编译期类型推导,提升代码简洁性与可维护性;它适用于复杂类型声明、泛型编程和模板场景,如简化迭代器使用、支持lambda表达式,并在容器类型变更时减少重构成本;但必须初始化且不支持同一语句中声明不同类型的变量。 auto 关键字在 C++11 中被重新定义,用来让编译…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信