C++友元函数为何虽在类内声明却不属于成员函数?
为什么类内声明的友元函数依然不是成员函数?
这真是个戳中C++友元本质的好问题!很多人刚接触友元的时候都会被类内声明这个点误导,我来给你拆解清楚核心原因:
本质是独立的外部函数,类内声明只是授予访问权限
友元函数在类内部的声明,仅仅是向编译器传递一个信息:“这个外部函数可以访问我的私有/保护成员”,它本身的作用域并不属于该类。你可以从这几个细节看出来:- 友元函数的定义不需要加
类名::前缀(除非它本身是另一个类的成员,但那是特殊情况); - 调用友元函数时,不需要通过类对象或者类名来调用(直接像普通全局函数一样调用即可);
- 它没有属于当前类的
this指针,必须显式传入类对象才能访问类的成员。
看个实际代码例子:
class Book { private: string title; // 类内声明友元函数 friend void showTitle(const Book& b); }; // 友元函数的定义完全独立于类 void showTitle(const Book& b) { // 能访问私有成员,但必须通过传入的对象b cout << "Book Title: " << b.title << endl; } int main() { Book myBook{"C++ Primer"}; // 直接调用,不需要myBook.showTitle()或者Book::showTitle() showTitle(myBook); return 0; }- 友元函数的定义不需要加
不具备成员函数的核心特征
成员函数是类的固有组成部分,天生拥有this指针,可以直接访问类的成员(无需显式对象);而友元函数没有this,完全是独立的函数实体。另外,成员函数会被纳入类的继承体系——子类可以继承父类的成员函数,但友元函数不会被继承,子类不会自动获得父类友元的访问权限。设计意图上是“外部助手”而非类接口的一部分
C++引入友元是为了在最小程度破坏封装的前提下,给特定外部实体开访问权限。如果把友元当成成员函数,就违背了这个设计初衷:成员函数是类对外提供的接口的一部分,而友元是特殊场景下的例外,本质还是外部函数,只是获得了“特权访问权”。哪怕是在类内直接定义的inline友元函数,它依然是全局(或所在命名空间)的函数,只是声明和定义合并在了类内部而已,不属于类的成员。
内容的提问来源于stack exchange,提问作者user41375
相关产品推荐
相关产品推荐

