c++ 基础特性 内联函数和友元函数

C++ 友元函数

类的友元函数是定义在类的外部,但是有权访问类的所有私有成员和保护成员,尽管友元函数的原型在类的定义中出现过,但是友元函数不是类的成员函数。

友元可以是一个类、也可以是一个函数,但是需要声明一个函数为一个雷的友元需要在类的定义中该声明函数的原型需要使用关键字friend.

class Box
{
   double width;
public:
   double length;
   friend void printWidth( Box box );
   void setWidth( double wid );
};

#include <iostream>
 
using namespace std;
 
class Box
{
   double width;
public:
   friend void printWidth( Box box );
   void setWidth( double wid );
};
 
// 成员函数定义
void Box::setWidth( double wid )
{
    width = wid;
}
 
// printWidth() 不是任何类的成员函数
void printWidth( Box box )
{
   /* 因为 printWidth() 是 Box 的友元,它可以直接访问该类的任何成员 */
   cout << "Width of box : " << box.width <<endl;
}
 
// 程序的主函数
int main( )
{
   Box box;
 
   // 使用成员函数设置宽度
   box.setWidth(10.0);
   
   // 使用友元函数输出宽度
   printWidth( box );
 
   return 0;
}
/*输出结果是
Width of box : 10
*/

内联函数

https://blog.csdn.net/lin_duo/article/details/84888766

内联函数通常与类在一起使用,如果一个函数是内联的,那么在编译的时候,编译器会把该函数的代码副本反之啊在每个调用该函数的地方,对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要更换一次所有的代码,否则将会继续使用旧的函数,如果想把一个函数定义为一个内联函数,则需要在函数名前防止关键字inline,在调用函数之前需要对函数进行定义,如果定义多于一行,那么编译器会护额略inline限定符。

#include <iostream>
// C++内联函数提供了替代函数调用的方案,
// 通过inline声明,编译器首先在函数调用处使用函数体本身语句替换了函数调用语句,
// 然后编译替换后的代码。
// 因此,通过内联函数,编译器不需要跳转到内存其他地址去执行函数调用,也不需要保留函数调用时的现场数据。
using namespace std;
inline int Max(int x, int y)
{
   return (x > y)? x : y;
}
// 程序的主函数
int main( )
{
   cout << "Max (20,10): " << Max(20,10) << endl;
   cout << "Max (0,200): " << Max(0,200) << endl;
   cout << "Max (100,1010): " << Max(100,1010) << endl;
   return 0;
}

C++ 内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。
对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。
如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline,在调用函数之前需要对函数进行定义。如果已定义的函数多于一行,编译器会忽略 inline 限定符。

inline函数的优缺点分析
优点:

它通过避免函数调用所带来的开销来提高你程序的运行速度。
当函数调用发生时,它节省了变量弹栈、压栈的开销。
它避免了一个函数执行完返回原现场的开销。
通过将函数声明为内联,你可以把函数定义放在头文件内。
缺点:

因为代码的扩展,内联函数增大了可执行程序的体积。
C++内联函数的展开是中编译阶段,这就意味着如果你的内联函数发生了改动,那么就需要重新编译代码。
当你把内联函数放在头文件中时,它将会使你的头文件信息变多,不过头文件的使用者不用在意这些。
有时候内联函数并不受到青睐,比如在嵌入式系统中,嵌入式系统的存储约束可能不允许体积很大的可执行程序。

什么时候该使用内联函数

当程序设计需要时,每个函数都可以声明为inline。下面列举一些有用的建议:

当对程序执行性能有要求时,那么就使用内联函数吧。
当你想宏定义一个函数时,那就果断使用内联函数吧。
在类内部定义的函数会默认声明为inline函数,这有利于 类实现细节的隐藏。

关键点

内联声明只是一种对编译器的建议,编译器是否采用内联措施由编译器自己来决定。甚至在汇编阶段或链接阶段,一些没有inline声明的函数编译器也会将它内联展开。
编译器的内联看起来就像是代码的复制与粘贴,这与预处理宏是很不同的:宏是强制的内联展开,可能将会污染所有的命名空间与代码,将为程序的调试带来困难。
所有中类中定义的函数都默认声明为inline函数,所有我们不用显示地去声明inline。
虚函数不允许内联。
虽然说模板函数放中头文件中,但它们不一定是内联的。(不是说定义在头文件中的函数都是内联函数)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值