c++里两个很特别的词儿,“友元”和“内联”,这俩算是编程语言里的特权身份了,

咱们聊聊 C++ 里两个很特别的词儿,“友元”和“内联”,这俩算是编程语言里的特权身份了,不过它们用起来可不一样。先说说友元函数,这就好比是能不看脸就能进主人家的那种熟人。它不在主人家里住,但是呢,它进了家就能随便进出人家的卧室、书房这些隐私的地方。所以呢,在类声明的时候,咱们会露个脸让它认识一下,但实际上它只是普通的全局函数,跟哪个类都不沾亲带故。这种特权有时候一个函数就能申请,有时候得一整个类都得靠过来才能享受。不管是哪种情况,编译器就不会管那么多了,直接让它随便动数据。 声明这块儿其实特别省事,只要在类定义里头把那个函数原型前面加个 friend 关键字就行。一旦加了,编译器就在外面到处找它的定义;要是没找到,链接器那边就得报错了。不过要小心啊,友元函数那可是不参与多态调用的,它不会继承类的那种灵活性。 再说说内联函数,这就相当于跟编译器打了个商量。意思是说如果你觉得我短时间内会被人频繁叫到,那你就别每次都去调用那个函数了,直接把代码复制一份贴在我当前的位置吧。这样能省点时间开销。不过要是代码太长了,超过一定的行数限制,编译器就当没看见这事儿,把它当成普通函数处理了。 在类里头定义的那些函数啊,默认都有资格当个内联候选的;但如果定义的代码超过一行了,那就被当成普通函数了。所以大家习惯把那些小短函数写在类里头定义好了,这样既方便成员调用又能省点性能。 这个还有一个缺点就是改动起来挺麻烦的。因为编译器直接把代码写死在调用的地方了,所以要是你改了逻辑的话,所有用到这个函数的地方都得重新编译一遍才行。这跟模板或者宏有点像要想避免这种麻烦呢,就得把重要的逻辑放在头文件里的宏或者模板里去处理,别直接去改内联的代码本体。 对比一下这俩词儿吧:一个有this指针这张身份证(指的是成员函数),另一个压根就没这东西(指的是友元)。这东西在成员函数里特别重要,让变量和对象能绑在一起;友元因为不是成员,根本不需要也不能用this来操作对象的数据。 总结一下:权限上友元靠的是friend声明获得特权;内联则是通过inline提示告诉编译器优化策略;所属关系上友元是“外人”;内联则属于类的内部成员;调用开销上友元基本没什么额外花费;内联可能因为复制代码稍微有点代码膨胀;修改影响上友元变了只影响调用点那一小块地方;内联变了可能导致所有相关的客户端都得跟着改一遍。理解了这两组关键字的区别后咱们就能在追求性能和保证代码安全之间找到最合适的点了。