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已定义
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值