C++編程札記「基礎」
一直以為自己最擅長的編程語言是C++,那時自己的水平停留在使用C++來實現數據結構中的各種ADT和ACM算法。
創建一個類,必須實現的成員函數
explicit
構造函數
對於單參數構造函數,添加explicit
關鍵字之後,會阻止隱式類型轉換(implicit type conversion)現象的出現。- 複製構造函數與
operator=
主要注意實現對整個對象的克隆(即深拷貝(deep copy))。一般的執行策略是,先實現operator=
,然後再在複製構造函數中調用。 - 析構函數
尚若類數據成員中存在指針變量,必須在析構函數中進行垃圾回收,避免空指針。
參數傳遞
主要有三種參數傳遞形式:按常量引用調用(call by constant reference)、按值調用(call by value)、引址調用(call by reference)。
使用策略是:如果形參必須能夠改變實參的值,那麼必須使用引址調用;否則,實參的值不能被改變。如果參數類型是簡單類型,則按值調用;否則,對複雜類型,按常量引用調用。
模板(template)|泛型算法
- 函數模板(function template)、類模板(class template):不是真正函數(類),而是一個用以產生函數(類)的公式。
- 函數對象(function object):定義一個包含零個數據和一個成員函數的類,然後通過這個類的實例。從效果上看,通過將其放在對象中實現了函數的傳遞。
- 模板的分離編譯:目前善不支持。
指針
- 在C語言中,關於內存操作的主要由四個函數:
- 動態創建對象new與垃圾回收delete
與數組相關的操作舉例:
int *p = new int[10];//創建數據類型變量
delete p;//垃圾回收
int **p = new int*[10]; //二維數組
for (int i = 0; i < 10; ++i) {
p[i]= new int[10];
for (int j = 0; j < 10; ++j) {
p[i][j] = i * j;
std::cout<<p[i][j]<<std::endl;
}
}
delete [] p;//二維數據的垃圾回收;此時不必考慮數組的維數。
- 取地址運算符(&)
- 指針僅僅是個特殊的變量,只是其存儲的內容是地址值
面向對象
- 抽象性(abstract)「歸類,分類」
- 封裝性(encapsulation)成員的訪問權限限制
- 繼承性(inheritance)「繼承自,派生出」
- 多態性(polymorphism)不同的對象接受到相同的消息時產生完全不同的的行為
C++語言支持兩種多態性: - 編譯時的多態性:通過函數重載實現。
- 運行時的多態性:通過虛函數來實現。
其他
- 友元函數、友元成員與友元類:獲取更大的權限:具備訪問類私有成員的權限。可惜會破壞類的封裝性和數據的隱蔽性,慎用。
- 內聯(inline)函數:使用空間換時間的措施。編譯器會將編譯后的全部內聯函數的目標代碼複製到程序內所有的引用位置并把往返傳送數據也都融合進引用位置的計算當中。
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合终身会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· C# 锁机制全景与高效实践:从 Monitor 到 .NET 9 全新 Lock
· 一则复杂 SQL 改写后有感
· golang中写个字符串遍历谁不会?且看我如何提升 50 倍
· C# 代码如何影响 CPU 缓存速度?
· 智能桌面机器人:使用 .NET 为树莓派开发 Wifi 配网功能
· 接口被刷百万QPS,怎么防?
· 提升Avalonia UI质感,跨平台图标库选型实践
· 告别图形界面:Windows系统OpenSSH服务部署
· C# 中委托和事件的深度剖析与应用场景
· Dify实战案例:AI邮件批量发送器!