1. 程式人生 > >C++類的內聯成員函式在哪定義

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)"([email protected]@@QAEXXZ),

該符號在函數 _main 中被引用。如果將測試函式改為:

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

system("pause"); 
return 0; 
} 

那麼執行結果正常。從此可以得出結論:行內函數放在標頭檔案或者.cpp中都是沒有錯的,

但如果需要在程式中訪問它,那麼就必須將其放在標頭檔案中。

相關推薦

C++成員函式定義

C++類的內聯成員函式的放置,應該放在標頭檔案中。那麼這到底是為什麼呢?僅僅是一種程式碼規範問題還是必須這樣做呢?     函式可以在多處宣告,但只能在一個地方定義,不然就會出現重定義。大部分函式預設是外部連結,而inline函式預設為內部鏈 接。也就是說inline函式只

CLion和C++靜態成員定義問題

有一段時間沒有用C++了,今天寫了一個簡單的單例模式,然後CLion一直報錯,連結錯誤,用VS跑結果一樣,也不行 VS錯誤資訊: CLion: 問題在於 Singleton.h class Singleton { private: Singleton

【03】成員函式、結構體、this指標、記憶體、作用域

C++程式的記憶體格局通常分為四個區:全域性資料區(data area),程式碼區(code area),棧區(stack area),堆區(heap area)(即自由儲存區)。全域性資料區存放全域性變數,靜態資料和常量;所有類成員函式和非成員函式程式碼存放在程式碼區;為執行函式而分配的區域性變數、函式引數

c++ 成員函式

#include<iostream> using namespace std; class Tan { private: int age; char*name; char*sex; public: void set(int age,char*name,char*sex) {

C++ 模板的成員函式程式碼筆記

#include <iostream> #include <cstring> using namespace std; template <class T> class Max4 { T a,b,c,d;

C++模板的成員函式模板寫法

這幾天本來想將Lua_Tinker移植到Linux上去的,但是由於VC中的模板寫法與gcc中的模板寫法有些不同之處,比如下面一段程式碼: struct pop_ { template<typename T> static T invoke(lua_S

成員函式及隱、顯式宣告

函式的呼叫過程需要消耗一些記憶體資源和執行時間來傳遞引數和返回值,要記錄呼叫時的狀態,以便保證呼叫完成後能夠正確地返回並繼續執行。 如果有的函式成員需要被頻繁呼叫,而且程式碼比較簡單,這個函式也可以定義為行內函數。 內聯成員函式的函式體,也會在編譯時被插入到每一個呼叫它的地方

c++的模板成員函式申明和實現必須放在一起

解釋如下: C++中每一個物件所佔用的空間大小,是在編譯的時候就確定的,在模板類沒有真正的被使用之前,編譯器是無法知道,模板類中使用模板型別的物件的所佔用的空間的大小的。只有模板被真正使用的時候,編譯器才知道,模板套用的是什麼型別,應該分配多少空間。這也就是模板類為什麼只是稱之為模板,而不是泛型的緣故。 既

在linux c++中的成員函式裡建立多執行緒要注意的地方

如何在linux 下c++中類的成員函式中建立多執行緒 linux系統中執行緒程式庫是POSIX pthread。POSIX pthread它是一個c的庫,用C語言進行多執行緒程式設計我這裡就不多說了,網上的例子很多。但是如何在C++的類中實現多執行緒程式設計呢?如果套

C++的預設成員函式

C++類有六個預設的成員函式,分別是建構函式、解構函式、拷貝建構函式、賦值運算子過載函式、&運算子過載函式、const &運算子過載函式。下面分別說明:定義一個class CTestClass{};類。1、建構函式類例項化時執行的函式。CTestClass()

4、【C++】靜態成員變數/靜態成員函式/行函數/友元函式/友元/友元成員函式

一、靜態成員     我們可以使用 static 關鍵字來把類成員定義為靜態的。當我們宣告類的成員為靜態時,這意味著無論建立多少個類的物件,靜態成員都只有一個副本。     靜態成員在類的所有物件中是共享的。如果不存在其他的初始化語句,在建立第一個物件時,所有的靜態資料都會被初始化為

effective c++讀書筆記——用模板函式替換類似函式的巨集定義

我們來看下面巨集定義:            #define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b)) 這般長的巨集有著太多缺點,光是想到它們就讓人痛苦不堪。無論何時當你寫出這種

C++基礎知識(六)----成員函式定義--物件的建立與使用--從面向過程到面向物件

一、類   1.類是一種資料型別,將資料與對資料的操作(函式)放到一起。一個類中的資料通常只能通過本類提供的方法進行處理,這些方法成為該類與外部的介面,物件之間通過訊息進行通訊。   2.如果在類的起始點無訪問說明符,系統預設為私有(private)   3.類是一種資料型別,定義時系統不為類分配儲存空

C++筆記 第二十六課 的靜態成員函式---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第二十六課 類的靜態成員函式 1.未完成的需求 統計在程式執行期間某個類的物件數目 保證程式的安全性(不能使用全域性變數) 隨時可以獲取當前物件的數目(Failure)

有關C++中資料成員變數定義的一些想法

最近開始學習C++,以前是學C的,對C++新生的類不是很懂,最近在看一些教程,發現有的教程只是簡單的告訴你什麼是類,還有怎麼使用類,但對於類的標準啥的並沒有進行標準化的介紹。 關於C++類中成員變數的定義,一般都是推薦這樣定義: 1.類中的屬性(不是函式)最好定義標準化,並且取名字能讓其

C++】的預設成員函式

1.建構函式 2.拷貝建構函式 3.解構函式、 4.運算子過載---實現一個日期計算器 c++類有6個預設成員函式:建構函式,拷貝建構函式,解構函式,賦值操作符過載。取地址操作符過載,const修飾的取地址操作符過載。其中前四個預設成員函式是我們重點研究物件

C++---的靜態成員變數和靜態成員函式

class Person { public : Person() { } static int m_Age ; //加入static 就是靜態成員變數,會共享資料; //靜態成員變數,在類內宣告,類外進行初始化; } int Person.m_Age = 0; //類外初始化

C++雜談 為什麼的空指標物件可以訪問某些的成員函式

class TestObject { public: TestObject() { std::cout << “TestObject!” << std::endl; } ~Tes

模板中的成員函式定義返回值為中的typedef型別時候注意

如果模板類中的成員要訪問類中的typedef型別必須加上關鍵字typename來指明它是一個型別。 如一下程式碼中的那個成員函式size。 #include <iostream> #include <string> template&