当前位置: 首页 > news >正文

CPP杂项

注意:声明类,只是告知有这个类未完全定义,若使用类里具体属性,要么将访问块(函数之类)放到定义后,要么直接完全定义

C++ 友元函数/类的使用关键点(声明顺序为核心)


1. 友元函数
  • 声明顺序

    • 非成员函数:需在类外提前声明函数,再在类内标记为友元。

      cpp

      复制

      void helper(); // 前向声明
      class MyClass {
          friend void helper(); // 正确:函数已声明
      };
      void helper() { ... }     // 实现
    • 直接定义在类内:无需提前声明,但视为隐式内联。

      cpp

      复制

      class MyClass {
          friend void helper() { ... } // 直接定义(隐式内联)
      };
  • 易错点
    若未提前声明,友元函数可能被误认为新函数(导致链接错误)。


2. 友元类
  • 声明顺序

    • 被友元的类(如 B)需至少前向声明,再在目标类(如 A)中标记为友元。

      cpp

      复制

      class B; // 前向声明
      class A {
          friend class B; // 正确:B已声明
      };
      class B { ... };     // 完整定义
    • 成员函数访问私有成员时B 的成员函数实现必须放在 A 的定义之后。

      cpp

      复制

      class B {
      public:
          void accessA(A& a); // 声明
      };
      class A {
          friend void B::accessA(A&);
          int secret;
      };
      void B::accessA(A& a) { a.secret = 42; } // 正确:A已定义
  • 易错点
    若 B 未前向声明直接标记为友元,可能编译失败(依赖编译器)。


3. 其他类的成员函数作为友元
  • 声明顺序
    成员函数所属的类(如 B必须先完整定义,再在目标类(如 A)中声明友元。

    cpp

    复制

    class B {
    public:
        void memberFunc(); // 声明
    };
    class A {
        friend void B::memberFunc(); // 正确:B已完整定义
    };
    void B::memberFunc() { ... }    // 实现需在A定义后
  • 易错点
    若 B 的成员函数实现放在 A 定义前,无法访问 A 的私有成员。


4. 核心原则
  1. 前向声明优先:友元函数/类需在使用前声明。

  2. 定义顺序敏感:访问私有成员的代码必须出现在被友元类之后。

  3. 单向性:友元关系不传递、不继承(如 A 友元 BB 的友元不自动成为 A 的友元)。


示例总结

cpp

复制

// 案例:B类的成员函数访问A的私有成员
class B; // 前向声明(非必须,但推荐)

class A {
    friend class B; // 或 friend void B::func();
private:
    int secret;
};

class B {
public:
    void func(A& a) { a.secret = 42; } // 正确:A已定义
};

相关文章:

  • 下载firefox.tar.xz后如何将其加入到Gnome启动器
  • 《Spring Boot+策略模式:企业级度假订单Excel导入系统的架构演进与技术实现》
  • vue3的一些新特性
  • vcs中的looprepprt
  • kafka存储原理
  • 定积分__
  • C应用常见的编程错误
  • java入门
  • LeetCode:有效的括号
  • mysql镜像创建docker容器,及其可能遇到的问题
  • 远程监控系统项目里练习
  • 分享一个可以跨平台进行等保核查的脚本
  • 记录一次家里宽带 被修改带宽维权的事情
  • Design Compiler:语法检查工具dcprocheck
  • mapbox基础,加载ESRI OpenStreetMap开放街景标准风格矢量图
  • C++中常见函数
  • 算法进阶指南 分形
  • Java垃圾回收的隐性杀手:过早晋升的识别与优化实战
  • 「合诚」携手企企通共建新材料和健康产业采购数智化新生态
  • rqlite:一个基于SQLite构建的分布式数据库
  • 呼和浩特推进新一轮国企重组整合:杜绝一项目一公司、一业务一公司
  • 巴基斯坦称成功拦截印度导弹,空军所有资产安全
  • 上汽享道出行完成13亿元C轮融资,已启动港股IPO计划
  • OpenAI任命了一位新CEO
  • 第1现场 | 50多年来首次!印度举行大规模民防演习
  • 深入贯彻中央八项规定精神学习教育中央第一指导组指导督导河北省见面会召开