关于C++类的inline 成员函数
C++要求对一般的内置函数要用关键字inline声明,但对类内定义的成员函数,可以省略inline,因为这些成员函数已经被隐含地指定为内置函数了。
应该注意的是:如果成员函数不在类体内定义,而在类体外定义,系统并不是把它默认为内置函数,调用这些成员函数的过程和调用一般函数的过程是相同的。如果想将这些成员函数指定为内置函数,则应该加inline关键字,如:
class student
{
public:
inline void display(); //声明此成员函数不内置函数
private:
int num;
string name;
char sex;
};
inline void student::display() //在类外定义内置函数
{
//内容
}
值得注意的是:如果在类体外定义inline函数,则心须将类定义和成员函数的定义都放在同一个头文件中,否则编译时无法进行置换。
只有在类外定义的成员函数规模很小而调用频率高时,才将此成员函数指定为内置函数。
- class Date {
- public:
- int day() const;
- // ...
- private:
- int d, m, y;
- }
- inline int Date::day const { return d; }
但是发现如果将函数声明和定义分开写在.h和.cc里面,虽然能编译成模块,但是却无法链接。
如以下例子:
Shell代码
- // test.h
- #ifndef _TEST_H_
- #define _TEST_H_
- class test {
- public:
- test();
- test(int);
- void show() const;
- private:
- int i;
- }
- #endif
- // test.cc
- #include <iostream>
- #include "test.h"
- using namespace std;
- test::test()
- : i(0)
- {
- }
- test::test(int _i)
- : i(_i)
- {
- }
- inline void show() const
- {
- cout << i << endl;
- }
- // main.cc
- #include "test.h"
- int main()
- {
- test t(10);
- 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中的话,那么在你调用这个函数时,只要包含这个文件能就编译成目标文件,但是在链接时,却会发现找不到这个函数体,而无法展开,从而造成链接失败。