列表

详情


86. 请你说一下内联函数和虚函数

回答思路

内联函数:

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

内联函数仅仅是对编译器的内联建议,编译器是否觉得采取你的建议取决于函数是否符合内联的有利条件。如何函数体非常大,那么编译器将忽略函数的内联声明,而将内联函数作为普通函数处理。在类内定义的函数都是内联函数,即使没有使用inline关键字。

代码示例:

Plain Text:

#include <iostream> 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; } </iostream>

优点:

通过避免函数调用所带来的开销来提高程序的运行效率;

当函数调用发生时,节省了变量弹栈、压栈的开销;

避免了一个函数执行完返回原现场的开销;

通过将函数声明为内联,可以把函数定义放在头文件内。

缺点:

因为代码的扩展,内联函数增大了可执行程序的体积;

C++内联函数的展开是在编译阶段,意味着如果内联函数发生了改动,那么要重新编译代码;

内联机制在嵌入式系统场景下并不受欢迎,嵌入式系统的存储约束可能不允许体积很大的可执行程序。

虚函数:

概念:

C++中,基类将类型相关的函数与派生类不做改变直接继承的函数区别对待。对于某些函数,基类希望它的派生类各自定义适合自身的版本,此时基类就将这些函数声明为虚函数(virtual function),方法为在函数返回类型前加上virtual关键字。C++11标准之后允许派生类显式的注明将使用哪个成员函数改写基类的虚函数,方法是在该函数的形参列表之后增加一个override关键字。

虚函数是用于C++的多态机制的实现,通过指向派生类对象的基类指针或者引用,来访问派生类中同名覆盖基类中的函数(声明为虚函数之后,能够在运行期识别出对象的动态类型,也就是基类指针或引用所绑定的究竟是基类对象,还是派生类对象)。

纯虚函数:虚函数的声明最后加上”=0”,即为纯虚函数,和虚函数在派生类各自实现自定义版本不同,纯虚函数只提供接口,不会被改写实现,具有纯虚函数的类称之为抽象类,无法被实例化。

虚函数代码示例:

Plain Text:

#include<iostream> using namespace std; class A { public: void print() { cout<<"This is A"<</iostream>

上一题