C++中的hpp文件及使用hpp文件的好處
1 什么是hpp文件?
hpp文件是C++程序中一種特殊頭文件,它可以包含類的聲明和實(shí)現(xiàn)。與傳統(tǒng)的h文件相比,hpp文件具有以下特點(diǎn):
- 將類的聲明和實(shí)現(xiàn)放在同一個(gè)文件里,減少了代碼量,提高了代碼的可讀性。
- 無需再將cpp加入到項(xiàng)目中進(jìn)行編譯,將代碼直接編譯到調(diào)用者的obj文件,不再生成單獨(dú)的obj,大幅度減少編譯次數(shù)。
- 非常適合編寫開源庫(kù),boost庫(kù)大量使用模板,采樣hpp的形式可以保持與各個(gè)編譯器更好的兼容性。
2 使用hpp文件的好處
- 減少代碼量,提高代碼可讀性
- 避免符號(hào)重定義錯(cuò)誤
- 提高編譯效率
- 方便編寫開源庫(kù)
- 提高代碼的可維護(hù)性
3 注意事項(xiàng)
與傳統(tǒng)的h文件相比,hpp文件有很多優(yōu)點(diǎn),但是在編寫hpp文件時(shí)也需要注意以下事項(xiàng):
① 不可包含全局對(duì)象和全局函數(shù)
由于hpp文件本質(zhì)上是作為h文件被調(diào)用者include,所以當(dāng)hpp文件中存在全局對(duì)象或者全局函數(shù),而該hpp被多個(gè)調(diào)用者include時(shí),將在鏈接時(shí)導(dǎo)致符號(hào)重定義錯(cuò)誤。要避免這種情況,需要去除全局對(duì)象,將全局函數(shù)封裝為類的靜態(tài)方法。
// 錯(cuò)誤示例 #include <iostream> int g_val = 0; // 全局對(duì)象 void print_val() { std::cout << g_val << std::endl; } // 正確示例 #include <iostream> class MyClass { public: void print_val() { std::cout << m_val << std::endl; } private: int m_val = 0; // 類成員 };
② 類之間不可循環(huán)調(diào)用
如果hpp文件中包含多個(gè)類,并且這些類之間存在相互依賴關(guān)系,那么在編譯時(shí)會(huì)導(dǎo)致循環(huán)依賴錯(cuò)誤。為了避免這種情況,需要對(duì)類之間的依賴關(guān)系進(jìn)行合理的設(shè)計(jì),避免循環(huán)調(diào)用。
// 錯(cuò)誤示例 #include <iostream> class A { public: void foo(B& b) { // ... } }; class B { public: void bar(A& a) { // ... } }; // 正確示例 #include <iostream> class A { public: void foo(B* b) { // ... } }; class B { public: void bar(A* a) { // ... } };
③ 不可使用靜態(tài)成員
hpp文件中的靜態(tài)成員在編譯時(shí)會(huì)被編譯到調(diào)用者的obj文件中,這會(huì)導(dǎo)致多個(gè)調(diào)用者共享同一個(gè)靜態(tài)成員。如果靜態(tài)成員發(fā)生變化,則會(huì)導(dǎo)致所有調(diào)用者都受到影響。因此,在hpp文件中應(yīng)避免使用靜態(tài)成員。
// 錯(cuò)誤示例 #include <iostream> class MyClass { public: static int s_val = 0; // 靜態(tài)成員 void print_val() { std::cout << s_val << std::endl; } }; // 正確示例 #include <iostream> class MyClass { public: void print_val() { int val = 0; // 局部變量 std::cout << val << std::endl; } };
④ 其他注意事項(xiàng)
- 在hpp文件中可以使用#include預(yù)處理指令來包含其他頭文件。
- 在hpp文件中可以使用#pragma once預(yù)處理指令來避免重復(fù)包含。
- 在hpp文件中可以使用using聲明來簡(jiǎn)化代碼。
// 示例 #include <iostream> #include <vector> #pragma once using namespace std; class MyClass { public: void print_val() { cout << m_val << endl; } private: int m_val = 0; };
到此這篇關(guān)于C++中的hpp文件 的文章就介紹到這了,更多相關(guān)C++ hpp文件 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用?c++?在?windows?上定時(shí)執(zhí)行一個(gè)函數(shù)的示例代碼
這篇文章主要介紹了使用c++在windows上穩(wěn)定定時(shí)執(zhí)行一個(gè)函數(shù),本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07C++?vector的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了C++?vector的簡(jiǎn)單實(shí)現(xiàn),使用數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03在C++中實(shí)現(xiàn)aligned_malloc的方法
這篇文章主要介紹了在C++中實(shí)現(xiàn)aligned_malloc的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03c語言程序設(shè)計(jì)文件操作方法示例(CreateFile和fopen)
c主要的文件操作函數(shù)有:CreateFile,CloseHandle,ReadFile,WriteFile,SetFilePointer,GetFileSize。其中的讀寫操作是以字符為單位,獲得文件大小也是以字符為單位。2013-12-12C++實(shí)現(xiàn)模擬shell命令行(代碼解析)
這篇文章主要介紹了C++實(shí)現(xiàn)模擬shell命令行,本文通過實(shí)例代碼進(jìn)行命令行解析,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12