在上篇文章《inline的另一用處》(見 http://www.linuxidc.com/Linux/2012-06/62558.htm )中,提到函數實現在類定義中與類定義外的區別。
現在先看個實驗:
a.cpp:
- #ifndef TEST_H
- #define TEST_H
- class A{
- public:
- int fun(int x){
- return (x*x+1000);
- }
- };
- #endif
-
- void tt()
- {
- }
b.cpp:
- class A{
- public:
- int fun(int x);
- };
- void tt();
- int yy()
- {
- tt();
- A a;
- return a.fun(3);
- }
-
將它們分別編譯後再鏈接:
顯示鏈接錯誤,因為b.cpp(b.o)中找不到A::fun(int)的引用。
將以上的a.cpp改為如下所示:
- #ifndef TEST_H
- #define TEST_H
- class A{
- public:
- int fun(int x);
- };
- #endif
- int A::fun(int x){
- return (x*x+1000);
- }
- void tt()
- {
- }
分別編譯a.cpp和b.cpp為a.o和b.o後鏈接,顯示鏈接成功。
這樣,第一次鏈接錯誤的原因就很明顯了。
結論:
在類定義中的類成員函數實現有文件內部作用域,而在類定義外部的類實現有的是全局作用域。