技術隨筆 知識點記錄 整理

2021-10-09 20:25:09 字數 800 閱讀 4215

這是一篇關於模板類成員函式實現為什麼要放在標頭檔案中的說明。

大家都知道要在標頭檔案裡宣告類成員,在原始檔中實現。

但是今天寫資料結構作業,在標頭檔案(stack.h)定義了乙個棧的模板類,在原始檔(stack.cpp)實現了相應的功能。但是編譯死活不過,怎麼改怎麼過不了。

結果發現,模板類不能只在標頭檔案裡宣告,必須在標頭檔案裡實現。

是不可能只在單獨的cpp檔案中編寫模板類實現並進行編譯的。如果有人說可以,那麼肯定是模仿單獨cpp檔案使用的辦法。實際上,如果打算編寫模板類庫並作為標頭檔案匯入,且隱藏實現,這根本不可能。

為什麼?

因為標頭檔案從不編譯,只會進行預處理。然後將預處理完的**與對應的、實際編譯的cpp檔案合併。c++中每乙個物件所佔的空間大小,是編譯的時候就確定了。在模板類沒有傳入資料型別的時候,編譯器無法知道該模板類的物件所占用的空間大小。

所以在預處理完的標頭檔案和原始檔結合的過程中,編譯器是完全不知道原始檔中模板類的空間大小的,但是它需要編譯原始檔。所以它無法編譯下去。

所以記住,只有模板類真正被使用的時候,編譯器才知道模板傳入的是什麼型別,需要分配多少空間。

模板類的實現,如果脫離了具體的資料型別,是絕對不可能單獨編譯的。更不用說在標頭檔案中宣告,在原始檔中實現這種不可取的方法了。

所以模板類的實現必須全部寫在標頭檔案裡!

當然了,也可以先在標頭檔案的類內部宣告,在花括號外面實現。

除非,你想在主檔案中,打出 #include "***x.cpp"的神奇操作。

整理知識點

python中的變數不需要宣告。每個變數在使用前都必須賦值,變數賦值以後該變數才會被建立。在python 中,變數就是變數,它沒有型別,我們所說的 型別 是變數所指的記憶體中物件的型別。乙個變數可以通過賦值指向不同型別的物件。python3 有六個標準的資料型別 不可變資料 number 數字 st...

知識點總結》隨筆

目錄 小知識點總結 mysql 中 in 和 exists 的區別 如果查詢的兩個表大小相當,那麼用in和exists差別不大。如果兩個表中乙個較小,乙個是大表,則子查詢表大的用exists,子查詢錶小的用in 例如 表a 小表 表b 大表 1 select from a where cc in s...

android知識點隨筆

android project中manifest.xml中的標籤元素決定的。此標籤包含如下3個屬性 android minsdkversion 此屬性決定你的應用能相容的最低的系統版本,一盤情況是必須設定此屬性。android targetsdkversion 此屬性說明你當前的應用是針對某乙個系統...