# inline那些事 ## 关于作者: 个人公众号: ![](../img/wechat.jpg) ## 1.类中内联 头文件中声明方法 ```c++ class A { public: void f1(int x); /** * @brief 类中定义了的函数是隐式内联函数,声明要想成为内联函数,必须在实现处(定义处)加inline关键字。 * * @param x * @param y */ void Foo(int x,int y) ///< 定义即隐式内联函数! { }; void f2(int x); ///< 声明后,要想成为内联函数,必须在定义处加inline关键字。 }; ``` 实现文件中定义内联函数: ```c++ #include #include "inline.h" using namespace std; /** * @brief inline要起作用,inline要与函数定义放在一起,inline是一种“用于实现的关键字,而不是用于声明的关键字” * * @param x * @param y * * @return */ int Foo(int x,int y); // 函数声明 inline int Foo(int x,int y) // 函数定义 { return x+y; } // 定义处加inline关键字,推荐这种写法! inline void A::f1(int x){ } int main() { cout< using namespace std; class Base { public: inline virtual void who() { cout << "I am Base\n"; } virtual ~Base() {} }; class Derived : public Base { public: inline void who() // 不写inline时隐式内联 { cout << "I am Derived\n"; } }; int main() { // 此处的虚函数 who(),是通过类(Base)的具体对象(b)来调用的,编译期间就能确定了,所以它可以是内联的,但最终是否内联取决于编译器。 Base b; b.who(); // 此处的虚函数是通过指针调用的,呈现多态性,需要在运行时期间才能确定,所以不能为内联。 Base *ptr = new Derived(); ptr->who(); // 因为Base有虚析构函数(virtual ~Base() {}),所以 delete 时,会先调用派生类(Derived)析构函数,再调用基类(Base)析构函数,防止内存泄漏。 delete ptr; ptr = nullptr; return 0; } ```