关于C++类的inline 成员函数

C++要求对一般的内置函数要用关键字inline声明,但对类内定义的成员函数,可以省略inline,因为这些成员函数已经被隐含地指定为内置函数了。
应该注意的是:如果成员函数不在类体内定义,而在类体外定义,系统并不是把它默认为内置函数,调用这些成员函数的过程和调用一般函数的过程是相同的。如果想将这些成员函数指定为内置函数,则应该加inline关键字,如:
class student
{
public:
inline void display(); //声明此成员函数不内置函数
private:
int num;
string name;
char sex;
};
inline void student::display() //在类外定义内置函数
{
//内容
}
值得注意的是:如果在类体外定义inline函数,则心须将类定义和成员函数的定义都放在同一个头文件中,否则编译时无法进行置换。
只有在类外定义的成员函数规模很小而调用频率高时,才将此成员函数指定为内置函数。

  1. class Date { 
  2. public: 
  3.     int day() const; 
  4.     // ... 
  5. private: 
  6.     int d, m, y; 
  7. inline int Date::day const { return d; } 

但是发现如果将函数声明和定义分开写在.h和.cc里面,虽然能编译成模块,但是却无法链接。
如以下例子:

Shell代码

  1. // test.h 
  2. #ifndef _TEST_H_ 
  3. #define _TEST_H_ 
  4. class test { 
  5. public: 
  6.     test(); 
  7.     test(int); 
  8.     void show() const; 
  9. private: 
  10.     int i; 
  11. #endif 
  12. // test.cc 
  13. #include <iostream> 
  14. #include "test.h"
  15. using namespace std; 
  16. test::test() 
  17. : i(0) 
  18. test::test(int _i) 
  19. : i(_i) 
  20. inline void show() const 
  21.     cout << i << endl; 
  22. // main.cc 
  23. #include "test.h"
  24. int main() 
  25.     test t(10); 
  26.     t.show(); 

在使用
$ g++ -c test.cc
$ g++ -c main.cc
时没有问题,但是在链接时
$ g++ -o test main.o test.o
会报错:
main.o(.text+0x35): In function `main':
main.cc: undefined reference to `test::show() const'

inline函数必须跟申明放在同一个文件中,因为它是需要就地展开的。
如果你不把它放在.h中的话,那么在你调用这个函数时,只要包含这个文件能就编译成目标文件,但是在链接时,却会发现找不到这个函数体,而无法展开,从而造成链接失败。

转载于:https://www.cnblogs.com/justinyo/archive/2013/03/13/2957504.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值