C++學習筆記總結練習:effective 學習日志

準則

1.少使用define

  • define所定義的常量會在預處理的時候被替代,出錯編譯器不容易找到錯誤。而且還沒有作用范圍限制,推薦使用const
  • define宏定義的函數,容易出錯,而且參數需要加上小括號,推薦使用inline
  • 有的類中例如數組初始化需要添加元素個數,如果define定義的常量沒有作用范圍限制,推薦使用enums

2.確定對象使用前先初始化

  • 為內置型對象進行手動初始化
  • 構造函數最好使用成員初始化列,如果在構造函數中進行賦值的話相當于先初始化默認值,然后有賦給值,導致浪費時間。
  • 為了免除跨編譯單元之初始化次序,將非本地靜態變量替換成本地靜態變量。因為靜態變量在程序編譯時就賦值存在,不會導致引用時未構造。

3.為多態基類聲明析構函數

  • 帶多態性質的基類應該聲明一個virtual的析構函數。如果class帶有任何virtual函數,它就應該擁有一個virtual析構函數
  • Classs的設計目的如果不是作為base classes使用,或不是為了具備多態性,就不該聲明virtual析構函數,因為設置virtual會使派生類帶上virtual 函數表,導致浪費空間。
class A{virtual ~A(){}
}
class B:pulic A{}
A *b=new (B);
//當未定義virtual 基類析構函數時,會調用A的析構函數,可能導致未釋放B新增內成員的的空間
delete b;

4.不要讓異常逃離析構函數

class DBconn{
public:
void close(){
db.close();
closed=true;
}
~DBconn(){
if(!closed)
try{
db.close()
}catch(...){
std:abort();//結束程序,不要讓異常傳出去,造成不確定后果
}
}
}
private:
DBConnection db;
bool closed;
};
//在對元素析構時,當兩個及以上元素出現異常時,程序就會停止或者造成不明確的行為,造成內存呢泄露
processWidget(std:trl::shared_ptrM<Widget> pr(new Widget),priority())

對于c++執行這句話,以什么樣的次序進行執行彈性很大,與java與c#不同1。如果以 new widget,priority(),shared_ptrM(),順序則可能出現內存泄露的風險。當priority出錯()時,將無法將new出來的內存進行刪除,因此最好以單獨語句執行。

std:trl::shared_ptrM<Widget> pr(new Widget);
processWidget(std:trl::shared_ptrM<Widget> pr,priority())

8.以引用傳遞代替值傳遞

  • 按值傳遞可能會使特化的信息別切割
class window{
public:virtual :display();
}class myWindow:public window{private:int size;public:virtual:display();
}
void useDisPlay1(window w){w.display();
}
void useDisplay2(window& w){w.display();
}
mywidow w;
useDisPlay1(w);//按值傳遞會使 mywindow所得有特化的信息被切割
userIdsPlay2(w);//按引用傳遞則不會使切割
  • 按值傳遞會讓編譯器去構造副本,對于一般自定義的類來說浪費時間和空間
  • 按值傳遞適合內置類型,STL迭代器和函數對象。因為傳遞引用的實質使傳遞指針。

9.inline的使用

  • 將大多數inline限制在小型、被頻繁調用的函數身上,這可使以后的調試過程和二進制升級更容易,也可使潛在的代碼膨脹問題最小化,使程序提升速度最大化。
  • 不要只因為function template 出現在頭文件就將他們設置為inline。

inline一定被放在頭文件是因為編譯器為了將函數調用代碼替換為函數本體 要知道函數本體長什么樣子

template 一定放在頭文件里是 因為一旦被使用,編譯器會將它具體化,得知道它長什么樣子。

10.將文件間的編譯依存關系降到最低

  • 如果使用object reference 或者obejct point 可以實現就不要用 object了。
  • 如果能夠,盡量以class聲明替代函數。
  • 為聲明式和定義式提供不同的頭文件
  • 或者將聲明類定義為abstrate 類,實現類繼承進行繼承。

就是將類的實現和申明寫成兩個類,然后在聲明類中引用實現類的指針。這樣當實現類中的成員進行變化時,聲明類不用重新編譯。而且聲明類中也無法看出方法的具體實現。

11.避免遮蔽繼承而來的名稱

class base{
private: 
int x;
public :
void fun()
}class drived :public base{public:using base:fun()void fun();
}
//子類fun()會遮蔽父類fun(),想用父類fun就要用 using base:fun()

derived的作用域

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ICDjcePv-1692172341730)(C:\Users\18440\AppData\Roaming\Typora\typora-user-images\image-20220830185337010.png)]

drived classes內的名稱會遮蔽base class內的名稱,為了讓遮蔽的名稱重用,用using 或者轉交函數

12.private繼承

  • private繼承意味is-implemented-in-terms of(根據某物實現)。它通常比復合成員的級別低。當derived class 需要訪問protected base class的成員,或需要重新定義繼承而來的virtual函數時,這么設計是合理的。
  • 和復合不同,private繼承可以造成empty base 最優化。這對致力于”對象尺寸最小化“的程序開發者而言,可能很重要。

13.多重繼承

  • 多重繼承比單一繼承復雜。它可能導致新的歧義性,以及對virtual繼承的需要。

  • virtual繼承會導致速度大小,初始化等等成本。如果virtual base classes 不帶任何數據,將是最具有實用價值的情況。

  • 多重繼承的確有正當途徑,當其中一個情節涉及”public繼承某個Interface class“ 和private 繼承某個協助實現的class的兩相組合。例如public 繼承的接口在private 繼承的類中有方法去實現。

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NEncUj9i-1692172341731)(C:\Users\18440\AppData\Roaming\Typora\typora-user-images\image-20220830215346169.png)]

14.將與參數無關的代碼抽離template

  • templates生成多個classes和多個函數,所以任何template代碼都不該與某個造成膨脹的template參數產生依賴關系。

  • 因非類型模板參數而造成的代碼膨脹,往往可以消除,做法是以函數參數或者class成員替換template函數。類如去定義類中一些參數,這樣的參數可以寫在類中。

  • 因類型參數造成的代碼膨脹,往往可以降低。做法是讓帶有完全相同的二進制表述的具體表述共享實現代碼。類如int與long可能公用一個模板。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41637.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41637.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41637.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

已經開源的中文大模型對比,支持更新

大模型下載&#xff1a;互鏈高科 ClueAI/PromptCLUE-base-v1-5 at main (huggingface.co) 支持多任務生成&#xff0c;支持中文&#xff0c;不支持多輪對話&#xff0c;體驗&#xff1a;ClueAI (cluebenchmarks.com) 基于promptclue-base進一步訓練的模型&#xff1a;ClueAI/Ch…

【C與C++的相互調用方法】

C與C的相互調用方法 C與C為什么相互調用的方式不同C中調用CC中調用C致謝 C與C為什么相互調用的方式不同 C 和 C 之間的相互調用方式存在區別&#xff0c;主要是由于 C 和 C 語言本身的設計和特性不同。 函數調用和參數傳遞方式不同&#xff1a;C 和 C 在函數調用和參數傳遞方面…

docker oracle linux命令執行sql

docker 安裝參照 https://blog.csdn.net/arcsin_/article/details/123707618 docker container ls -a命令查看容器名 打開容器 docker exec -it orcl19c_03 /bin/bashsys 用戶登錄容器 sqlplus / as sysdbashow pdbs;什么是pdb數據庫&#xff1f;什么是CDB&#xff1f; 參…

游戲如何防御DDOS流量攻擊呢,用游戲盾真的有用么?

針對在線游戲行業來說&#xff0c;DDoS&#xff08;分布式拒絕服務&#xff09;攻擊是一種極具破壞性的威脅。DDoS攻擊可能導致游戲服務器不可用&#xff0c;嚴重影響游戲體驗和運營。為了解決這一問題&#xff0c;游戲盾作為一種專門為游戲行業設計的安全解決方案&#xff0c;…

微信小程序 藍牙設備連接,控制開關燈

1.前言 微信小程序中連接藍牙設備&#xff0c;信息寫入流程 1、檢測當前使用設備&#xff08;如自己的手機&#xff09;是否支持藍牙/藍牙開啟狀態 wx:openBluetoothAdapter({}) 2、如藍牙已開啟狀態&#xff0c;檢查藍牙適配器的狀態 wx.getBluetoothAdapterState({}) 3、添加…

第十三章 SpringBoot項目(總)

1.創建SpringBoot項目 1.1.設置編碼 1.4.導入已有的spring boot項目 2.快速搭建Restfull風格的項目 2.1.返回字符串 RestController public class IndexController {RequestMapping("/demo1")public Object demo1() {System.out.println("demo1 ran...."…

kafka的位移

文章目錄 概要消費位移__consumer_offsets主題位移提交 概要 本文主要總結kafka的位移是如何管理的&#xff0c;在broker端如何通過命令行查看到位移信息&#xff0c;并從代碼層面總結了位移的提交方式。 消費位移 對于 Kafka 中的分區而言&#xff0c;它的每條消息都有唯一…

0基礎學習VR全景平臺篇 第86篇:智慧眼-為什么要設置分組選擇?

一、功能說明 分組選擇&#xff0c;也就是給全景的每個分組去設置其所屬的行政區劃&#xff0c;設置后只有屬于同行政區劃的成員才可進入其場景進行相關操作&#xff0c;更便于實現城市的精細化管理。 二、后臺編輯界面 分組名稱&#xff1a;場景的分組名稱。 對應分類&…

網絡安全--linux下Nginx安裝以及docker驗證標簽漏洞

目錄 一、Nginx安裝 二、docker驗證標簽漏洞 一、Nginx安裝 1.首先創建Nginx的目錄并進入&#xff1a; mkdir /soft && mkdir /soft/nginx/cd /soft/nginx/ 2.下載Nginx的安裝包&#xff0c;可以通過FTP工具上傳離線環境包&#xff0c;也可通過wget命令在線獲取安裝包…

【數據結構與算法】隊列

文章目錄 一&#xff1a;隊列1.1 隊列的概念1.2 隊列的介紹1.3 隊列示意圖 二&#xff1a;數組模擬隊列2.1 介紹2.2 思路2.3 代碼實現2.3.1 定義隊列基本信息2.3.2 初始化隊列2.3.3 判斷隊列是否滿&#xff0c;是否為空2.3.4 添加數據到隊列2.3.5 獲取隊列數據&#xff0c;出隊…

垃圾回收機制

什么是內存泄漏&#xff1f; 內存泄漏是指程序中已經不再使用的內存卻沒有被正確釋放或回收的情況。在編程中&#xff0c;當對象或數據不再被程序使用&#xff0c;但其所占用的內存空間沒有被垃圾回收機制回收&#xff0c;就會導致內存泄漏。 內存泄漏可能會導致程序的內存消…

圖數據庫_Neo4j和SpringBoot整合使用_創建節點_刪除節點_創建關系_使用CQL操作圖譜---Neo4j圖數據庫工作筆記0009

首先需要引入依賴 springboot提供了一個spring data neo4j來操作 neo4j 可以看到它的架構 這個是下載下來的jar包來看看 有很多cypher對吧 可以看到就是通過封裝的驅動來操作graph database 然后開始弄一下 首先添加依賴

【實用黑科技】如何 把b站的緩存視頻弄到本地——數據恢復軟件WinHex 和 音視頻轉碼程序FFmpeg

&#x1f468;?&#x1f4bb;個人主頁&#xff1a;元宇宙-秩沅 &#x1f468;?&#x1f4bb; hallo 歡迎 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;?&#x1f4bb; 本文由 秩沅 原創 &#x1f468;?&#x1f4bb; 收錄于專欄&#xff1a;效率…

onnxruntime 支持的所有后端

1 代碼導出 import onnxruntime as ort aaa ort.get_all_providers() print(aaa)1. 1 下面是ort支持的所有后端 TensorrtExecutionProvider, CUDAExecutionProvider, MIGraphXExecutionProvider, ROCMExecutionProvider, OpenVINOExecutionProvider, DnnlExecutionProvider…

Baumer工業相機堡盟工業相機如何通過BGAPISDK設置相機的固定幀率(C#)

Baumer工業相機堡盟工業相機如何通過BGAPI SDK設置相機的固定幀率&#xff08;C#&#xff09; Baumer工業相機Baumer工業相機的固定幀率功能的技術背景CameraExplorer如何查看相機固定幀率功能在BGAPI SDK里通過函數設置相機固定幀率 Baumer工業相機通過BGAPI SDK設置相機固定幀…

藍牙資訊|中國智能家居前景廣闊,藍牙Mesh照明持續火爆

據俄羅斯衛星通訊社報道&#xff0c;中國已成為全球最大的智能家居消費國&#xff0c;占全球50%—60%的市場份額。未來&#xff0c;隨著人工智能技術的發展以及智能家居生態的不斷進步&#xff0c;智能家居在中國的滲透率將加速提升。德國斯塔蒂斯塔調查公司數據顯示&#xff0…

win10系統docker創建ubuntu容器解決開發環境問題

一、win10系統使用docker的原因 最近啊&#xff0c;在學習人工智能-深度學習&#xff0c;用的win10系統進行開發&#xff0c;老是出現一些莫名其妙的問題&#xff0c;無法解決&#xff0c;每天都在為環境問題搞得傷透了腦筋。 說到底還是要使用Linux系統進行開發比較合適。 …

【MT32F006】MT32F006之HT1628驅動LED

本文最后修改時間&#xff1a;2023年03月30日 一、本節簡介 本文介紹如何使用MT32F006連接HT1628芯片驅動LED。 二、實驗平臺 庫版本&#xff1a;V1.0.0 編譯軟件&#xff1a;MDK5.37 硬件平臺&#xff1a;MT32F006開發板&#xff08;主芯片MT32F006&#xff09; 仿真器&a…

LeetCode算法心得——限制條件下元素之間的最小絕對差(TreeSet)

大家好&#xff0c;我是晴天學長&#xff0c;今天用到了Java一個非常實用的類TreeSet&#xff0c;能解決一些看起來棘手的問題。 1 &#xff09;限制條件下元素之間的最小絕對差 2) .算法思路 初始化變量&#xff1a;n為列表nums的大小。 min為整型最大值&#xff0c;用于記錄…

python3 0學習筆記之基本知識

0基礎學習筆記之基礎知識 &#x1f4da; 基礎內容1. 條件語句 if - elif - else2. 錯誤鋪捉try - except(一種保險策略&#xff09;3. 四種開發模式4. 函數&#xff1a;def用來定義函數的5. 最大值最小值函數&#xff0c;max &#xff0c;min6. is 嚴格的相等&#xff0c;is no…