C++ 友元函数与非友元函数的对比与选择

友元函数可访问类私有成员,非友元函数只能访问公有成员。选择友元函数用于需要修改私有数据或调用私有函数的情况;选择非友元函数用于仅需要访问公有成员的情况。

C++ 友元函数与非友元函数的对比与选择

C++ 友元函数与非友元函数的对比与选择

简介

在 C++ 中,类是数据和行为的封装,而函数是独立于类的代码块。在某些情况下,我们需要允许非成员函数访问类的私有成员变量和函数。这就是友元函数和非友元函数的特性所在。

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

友元函数

友元函数是声明为类友元的非成员函数。它们被授予对类私有成员的访问权限,即使这些成员在类外部。要将函数声明为友元,请使用关键字 friend。

class MyClass {private:    int data;public:    friend void printData(MyClass& obj);};void printData(MyClass& obj) {    cout 

非友元函数

非友元函数是任何未声明为类友元的函数。它们只能访问类的公有成员。因此,它们不能访问类的私有数据。

class MyClass {private:    int data;public:    void printData() {        cout 

选择友元函数还是非友元函数

选择友元函数还是非友元函数取决于需要访问私有成员的程度。

使用友元函数的场景:

登录后复制当需要从非成员函数中修改类的私有数据时。当需要从非成员函数中访问类的私有函数时。

使用非友元函数的场景:

当只需要访问类的公有成员时。当不想授予非成员函数访问私有成员的权限时。

实战案例:

假设我们有一个 Student 类,它具有私有变量 name 和 age。现在,我们要创建两个函数:printStudentData() 和 incrementStudentAge()。

printStudentData() 友元函数:

#include class Student {private:    std::string name;    int age;public:    friend void printStudentData(Student&);};void printStudentData(Student& student) {    std::cout 
  • incrementStudentAge() 非友元函数:
void incrementStudentAge(Student& student) {    // 错误:无法访问 private 变量 age    student.age++;}

登录后复制

在 printStudentData() 友元函数中,我们可以访问私有变量 name 和 age,并打印它们的值。在 incrementStudentAge() 非友元函数中,由于我们无法访问私有变量 age,因此会抛出错误。

以上就是C++ 友元函数与非友元函数的对比与选择的详细内容,更多请关注【创想鸟】其它相关文章!

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

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2448616.html

(0)
上一篇 2025年3月3日 17:37:16
下一篇 2025年2月23日 19:41:50

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 揭秘 C++ 函数卓越性能背后的优化之道

    c++++ 函数优化策略可以显著提升性能,包括:1. 内联函数;2. 传引用而不是传值;3. 避免动态内存分配;4. 使用寄存器变量;5. 向量化循环。通过这些优化,可以显着提升 c++ 函数性能,从而提高整体应用程序性能。 揭秘 C++ …

    2025年3月3日
    200
  • C++ 函数预处理器在实际项目中的应用

    函数预处理器在 c++++ 中具有广泛应用,包括:通过条件编译动态包含或排除代码。通过文件包含组织项目结构并避免名称冲突。通过宏定义创建常量和枚举,提高代码的可读性和可维护性。 C++ 函数预处理器的实际项目应用 函数预处理器是 C++ 中…

    2025年3月3日
    200
  • C++ 函数库函数在不同的平台上是否兼容?

    不同平台上的 c++++ 函数库函数兼容性问题源于函数原型和 abi 的差异,导致移植时可能出现链接失败或运行时错误。解决方法包括使用跨平台接口、条件编译或动态加载。 C++ 函数库函数在不同平台上的兼容性 C++ 函数库函数的兼容性问题是…

    2025年3月3日
    200
  • 构造函数和析构函数在 C++ 中的底层实现是什么?

    c++++ 构造函数和析构函数的底层实现:构造函数分配内存,调用默认构造函数,然后执行用户定义的初始化操作。析构函数执行用户定义的清理操作,调用基类析构函数,然后释放内存。 C++ 构造函数和析构函数的底层实现 引言 构造函数和析构函数是 …

    2025年3月3日
    200
  • C++ 函数指针的优点和缺点

    优点:灵活性(动态更改函数指向)、支持回调函数、便于事件处理。缺点:类型安全问题、可读性差、调试困难。 C++ 函数指针的优点和缺点 函数指针是一种指向函数的指针。它们允许对函数进行间接调用,这对动态编程、回调函数和事件处理非常有用。 优点…

    2025年3月3日
    200
  • C++ 函数并发编程中的条件变量使用技巧?

    条件变量的使用技巧:用于协调多线程之间的并发访问,尤其是在需要等待条件满足时。常与互斥锁结合使用,确保对共享资源的独占访问。基本操作:wait():线程等待条件满足并释放互斥锁。notify_one():唤醒一个等待线程,不释放互斥锁。no…

    2025年3月3日
    200
  • C++ 函数的库函数的版本差异有哪些?

    库函数在不同 c++++ 版本中可能存在差异,导致兼容性问题。这些差异包括:函数签名变化:参数和返回类型可能改变。功能变化:库函数的功能可能改变。编译器差异:不同编译器处理代码的方式可能不同。要解决版本差异,使用兼容的编译器和库。还可以使用…

    2025年3月3日
    200
  • 人工智能驱动的 C 依赖关系管理

    人工智能驱动的依赖关系管理利用人工智能算法自动化软件开发中的依赖关系识别、版本选择和冲突解决。通过集成工具、配置设置、扫描代码库、选择版本和解决冲突,ai算法可以高效地管理依赖关系。这可以简化流程,节省时间并最大限度地减少错误的风险,就像在…

    2025年3月3日
    200
  • C++ 函数的 STL queue 怎么用?

    stl 的 queue 是一种先进先出的(fifo)容器,具有以下特性:先进先出、动态大小、线程安全。使用步骤包括:包含头文件、声明队列、插入元素(push())、删除元素(pop())、获取队列大小(size())。实战案例:创建一个整数…

    2025年3月3日
    200
  • C++ 函数速度提升妙招,全面提升效率

    C++ 函数速度提升妙招,全面提升效率 在 C++ 中提升函数速度至关重要,可以有效提升整体程序性能。本文将介绍几种行之有效的妙招,帮助你优化函数速度。 1. 内联函数 内联函数指示编译器在调用时将函数代码直接插入到调用点,而不是跳到函数定…

    2025年3月3日
    200

发表回复

登录后才能评论