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. 核心原则
-
前向声明优先:友元函数/类需在使用前声明。
-
定义顺序敏感:访问私有成员的代码必须出现在被友元类之后。
-
单向性:友元关系不传递、不继承(如
A
友元B
,B
的友元不自动成为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已定义 };