突破C++瓶颈,在此一举!
課程介紹
C++ 不僅能兼容 C 語言,并且還繼承了 C 語言的運行速度,因此在許多大型項目中都可以看到 C++ 的身影。封裝、繼承、多態、模板作為 C++ 的重要特性。掌握封裝、繼承、多態、模板對提高開發效率有著很明顯的提升。
本課程容納了很多知識點和實驗操作,學習本課程的關鍵因素在于動手去做,多做實驗并要做相關的記錄,這都將是以后開發中的寶貴經驗。
本課程共 21 個實驗章節,主要針對封裝、繼承、多態、模板這 4 個特性作為基礎進行講解實驗,并且圍繞這 4 個特性講解了很多與之相關的其他知識點。
課程難度
較難
適合人群
- 對 C 語言或者 C++ 有基礎知識的同學
- 想要在 C++ 繼續深入學習的同學
- 想進入 C++ 實戰的同學
只要課程有一點啟發,那就是一個重大的提升,本課程也許就是你突破瓶頸的機會,不論你是準備進軍 C++ 開發的準程序員還是混跡職場的 C++ 開發程序員,都可以深入學習!
第一章 認識類與對象
知識點
- 認識類與對象
- 內聯函數
- string 類
- 類的定義與實例化
官方定義
類:在面向對象編程中是一種面向對象計算機編程語言的構造,是創建對象的藍圖,描述了所創建的對象共同的屬性和方法。
對象:通過類創建出對象,又稱實例化對象。
深入理解類
類是 C++ 的核心特性,在 C++ 的世界中,可以將所有事物都看作為一個對象,將對象進行封裝之后成為一個類,通常被稱為用戶定義類型。
例如:可以將貓、狗、鳥、桌子、學生、人、三角形、矩形等都封裝為一個類,只要在實際編程中用到的都可以抽象封裝為一個類。
C++ 相關概念
| 構造函數 | 類的構造函數是一種特殊的函數,在創建一個新的對象時自動調用 |
| 析構函數 | 類的析構函數也是一種特殊的函數,在刪除所創建的對象時自動調用 |
| 拷貝構造函數 | 拷貝構造函數,是一種特殊的構造函數,它在創建對象時,是使用同一類中之前創建的對象來初始化新創建的對象 |
| 友元函數 | 友元函數可以訪問類的 private 和 protected 成員 |
| 內聯函數 | 通過內聯函數,編譯器試圖在調用函數的地方擴展函數體中的代碼 |
| 類成員函數 | 類的成員函數是指那些把定義和原型寫在類定義內部的函數,就像類定義中的其他變量一樣 |
| 類訪問修飾符 | 類成員可以被定義為 public、private 或 protected。默認情況下是定義為 private |
| this 指針 | 每個對象都有一個特殊的指針 this,它指向對象本身 |
| 靜態成員 | 類的數據成員和成員函數都可以被聲明為靜態的 |
自定義類
假設最近在做一個學校管理系統的項目,首先想到可以將學生定義為一個類,然后發現可以在學生類的基礎上再抽象出一個人類的對象,如果需要用到學生的學科,可以進一步將學科也封裝為一個,還可以封裝文件操作類,數據庫操作類等等。
類定義注意事項:
實例化對象
實例化對象有兩種方式,一種是在棧上實例化,另一種是在堆上實例化。
實例化對象注意事項:
string 類
C++ 標準庫:前人開發時編寫的類,并被收錄成為通用的標準類,之后的人開發時可以直接使用,避免重復造輪子。string 類是開發時經常會使用到的一個類。
string 類是 C++ 標準庫中的字符串類,專用于字符串操作,接下來介紹一下如何使用 string 類。
string 介紹
string 初始化方式
| string s1; | s1 為空字符串 |
| string s2(“ABC”); | s2 初始值為 “ABC” |
| string s3 = s2; string s3(s2); | s3 初始化為 s2 的一個副本 |
| string s4(n, ‘c’ ); | s4 初始化為字符 ‘c’ 的 n 個副本 |
string 常用操作
以下列出了 string 經常使用的操作,如果還需要用到其他操作可以在 官網 查找 string 類的相關使用方法,里面配有示例程序。
| s.empty() | 判斷 s 是否為空,如果 s 為空返回 true,否則返回 false |
| s.size() | 返回 s 中字符的個數,和 s.length() 功能相同 |
| s[n] | 返回 s 中位置 n 的字符,位置從0開始。切記不要越界 |
| s1 + s2 | 將 s1 和 s2 連接成新字符串,返回新字符串 |
| s1 = s2 | 賦值,將 s2 內容賦值給 s1 |
| s1 == s2 | 判斷相等,相等返回 true,否則返回 false |
| s1 != s2 | 判斷不等,不等返回 true,否則返回 false |
| s.c_str() | 返回 char*,和 s.data() 功能相同 |
| stoi() | 字符串轉 int,還有 stol(),stoll() |
| stof() | 字符串轉 float, 還有 stod(),stold() |
內聯函數
官方定義:內聯函數又是稱作 “在線函數” 或者 “編譯時期展開函數” 的一種編程語言結構,用來建議編譯器對一些特殊函數進行內聯擴展;也就是說建議編譯器將制定的函數體插入并取代每一次調用該函數的地方,從而節省每次調用函數帶來的額外時間開支。
編譯過程
類內聯函數
如下圖是使用類內定義一個類的方法(“類的定義域實例化” 小節中會講到類內定義),而使用類內定義的成員函數編譯器會默認將成員函數當做為內聯函數進行編譯。但如果成員函數比較復雜,編譯器也不會將成員函數當做內聯函數進行編譯。
類的定義與實例化
在學習本小節之前先來學習另外兩個知識點:
- 類內定義
- 類外定義
類內定義
類內定義即在類中實現成員函數。
在課程的示例代碼中,類中定義的成員函數都是使用的類內定義的方式實現的,在實際的開發中不建議這樣做,除非是定義一個非常簡單的類或者成員函數。
在內聯函數小節中提到過,類內定義的方式編譯器會自動嘗試將成員函數作為內聯函數進行編譯,如果成員函數比較復雜,編譯器將不會作為內聯函數進行編譯。
在實際開發過程中需要考慮到程序的架構問題,類內定義適用于一個相對比較簡單的程序,考慮到開發時的方便性和時間成本,類外定義是實際程序開發中常用的方法。
類外定義
類外定義有兩種方式:
同文件類外定義就是將類的成員函數定義在類之外的地方,同時類的成員函數使用類作用域來進行定義。在實際項目開發中,類不是很復雜時可以使用該方法,類比較復雜時不推薦使用。
分文件定義類就是將類的定義放在 xxx.h 頭文件中,而類的成員函數實現放在 xxx.cpp 文件中。這種做法是做項目時推薦使用的方法,因為這樣將類的定義和成員函數分開后,在開發時很容易能夠查找到對應的定義和成員函數。
一般情況下文件名和類名相同,便于開發時類管理。
第一章知識點總結
- 深入認識類與對象并講解 C++ 相關概念。
- 如何使用 string 類。
- 普通內聯函數與類內聯函數以及編譯器對內聯函數的處理。
- 學習類內定義與類外定義,開發時常使用分文件類外定義的方法。
- main 函數的返回值為 int 類型,注意不要寫成 void 類型。
剩余章節內容,點擊《C++ 進階應用實戰》即可學習。
總結
以上是生活随笔為你收集整理的突破C++瓶颈,在此一举!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从零上手 GDB 调试,看这个教程就够了
- 下一篇: 要学好 C 语言 / C++ ,Make