C++类的内联成员函数在哪定义

    C++类的内联成员函数的放置,应该放在头文件中。那么这到底是为什么呢?仅仅是一种代码规范问题还是必须这样做呢?
    函数可以在多处声明,但只能在一个地方定义,不然就会出现重定义。大部分函数默认是外部链接,而inline函数默认为内部链
接。也就是说inline函数只能在本文件中使用,对其他文件是不可见的。一般我们使用某个类的时候,都是在文件中加
上该类的头文件,以便我们可以使用该类的接口。而我们类的成员函数的实现都是放在相应的.cpp文件中的,而在.h
文件中声明。这样我们便可以通过.h文件中的成员函数的声明找到其定义,继而使用成员函数了。但如果将inline函数
放在.cpp文件中,那么其只对.cpp文件有效,这样我们就无法访问它了。所以我们将其放在类的声明的头文件中,这
样通过包含该头文件来使用它。
下面写个实际的例子来说明一下,先把内联函数放到类声明的头文件中:
/*test.h*/ 
#ifndef TEST_H 
#define TEST_H 

#include <iostream> 
using std::cout; 
using std::endl; 

class test 
{ 
public: 
test():x(10){} 
inline void print(); 
void display (int y); 
private: 
int x; 
}; 

void test::print() 
{ 
cout << x << endl; 
} 

#endif 


/*test.cpp*/ 
#include <iostream> 
#include "test.h" 
using std::cout; 
using std::endl; 

void test::display(int y) 
{ 
cout << x * y << endl; 
} 

/*main.cpp*/ 
#include <iostream> 
#include "test.h" 
using namespace std; 

int main() 
{ 
test T; 
T.display(10); 
T.print(); 

system("pause"); 
return 0; 
} 

运行结果正常,下面来看看将内联函数放到.cpp中去:
/*test.h*/ 
#ifndef TEST_H 
#define TEST_H 

#include <iostream> 
using std::cout; 
using std::endl; 

class test 
{ 
public: 
test():x(10){} 
inline void print(); 
void display (int y); 
private: 
int x; 
}; 

#endif 

/*test.cpp*/ 
#include <iostream> 
#include "test.h" 
using std::cout; 
using std::endl; 

void test::print() 
{ 
cout << x << endl; 
} 

void test::display(int y) 
{ 
cout << x * y << endl; 
} 

测试函数和上面的main.cpp是一样的。这是出现了错误:

error LNK2019: 无法解析的外部符号 "public: void __thiscall test::print(void)"(?print@test@@QAEXXZ),

该符号在函数 _main 中被引用。如果将测试函数改为:


int main() 
{ 
test T; 
T.display(10); 
//T.print(); 

system("pause"); 
return 0; 
} 

那么运行结果正常。从此可以得出结论:内联函数放在头文件或者.cpp中都是没有错的,

但如果需要在程序中访问它,那么就必须将其放在头文件中。

猜你喜欢

转载自blog.csdn.net/ruofengtianxia/article/details/55049637