Wiki
C++基礎初識
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
1.C++初識
1.1.本章執行約定
本章的程式碼示例預設在 ch1-C++开发环境与第一个工程 下載並跑通的 CMake 模板中執行。
從這一章開始,前期語法練習只改這個檔案:
src/main.cpp
每個示例都可以把程式碼複製到 src/main.cpp 中,然後重新構建並執行模板程式。
暫時不要修改這些檔案和目錄:
CMakeLists.txtsrc/CMakeLists.txtsrc/lib1/src/lib2/
也不用手動寫 g++ main.cpp。我們繼續用上一章已經跑通的 CMake 模板來編譯程式。
常用命令:
cmake --build --preset linux-debug
./build/linux-debug/src/cmake_template
如果你還沒有完成上一章的工程環境搭建,請先看從 C++開發環境與第一個工程 開始,本教程一直使用同一個 CMake 模板。寫到這裡時,你的工程大致還是這個結構.
1.2.第一個C++程式
開啟工程中的:
src/main.cpp
把內容替換為:
#include <iostream>
using namespace std;
int main()
{
// 程序从 main 函数开始执行,下面的语句会按顺序运行。
cout << "Hello world" << endl;
// 返回 0 表示程序正常结束。
return 0;
}
執行結果:
Hello world
1.2.1.構建並執行程式
在工程根目錄執行:(或者直接用上一節講的圖形化介面編譯,下面也會再教你一下)
cmake --build --preset linux-debug
./build/linux-debug/src/cmake_template
圖形化步驟:
配置成build+debug模式:

點選左下角的build.

執行


終端輸出:
Hello world
1.3.main函式引數
main 函式不是必須帶引數。最常見的兩種寫法是:
int main()
{
// 程序从 main 函数开始执行,下面的语句会按顺序运行。
// 返回 0 表示程序正常结束。
return 0;
}
執行結果: 程式正常結束,終端沒有輸出。
int main(int argc, char* argv[])
{
// 程序从 main 函数开始执行,argc/argv 用来接收命令行参数。
// 返回 0 表示程序正常结束。
return 0;
}
執行結果: 程式正常結束,終端沒有輸出。
其中:
argc表示命令列引數的數量,通常至少為 1,因為程式自身的路徑也會算作一個引數。argv表示命令列引數陣列,argv[0]通常是程式自身的路徑或名稱,argv[1]開始才是使用者傳入的引數。char* argv[]也可以寫成char** argv,兩者在這裡表達的含義相同。
示例:
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
// 程序从 main 函数开始执行,argc/argv 用来接收命令行参数。
cout << "argc = " << argc << endl;
for (int i = 0; i < argc; i++) {
cout << "argv[" << i << "] = " << argv[i] << endl;
}
// 返回 0 表示程序正常结束。
return 0;
}
執行結果:見下方“執行結果”;argv[0] 會隨啟動方式不同而變化,重點觀察 argc 和各個 argv 的對應關係。
構建並傳入命令列引數執行:
cmake --build --preset linux-debug
./build/linux-debug/src/cmake_template hello 123
執行結果:
argc = 3
argv[0] = ./build/linux-debug/src/cmake_template
argv[1] = hello
argv[2] = 123
注意:
argv[0]的具體內容和啟動方式有關,可能是./build/linux-debug/src/cmake_template,也可能是完整路徑。實際處理引數時,通常從argv[1]開始讀取使用者輸入的內容。
1.4.註釋
作用:在程式碼中加一些說明和解釋,方便自己或其他程式設計師程式設計師閱讀程式碼
兩種格式
- 單行註釋:
// 描述信息- 通常放在一行程式碼的上方,或者一條語句的末尾,==對該行程式碼說明==
- 多行註釋:
/* 描述信息 */- 通常放在一段程式碼的上方,==對該段程式碼做整體說明==
提示:編譯器在編譯程式碼時,會忽略註釋的內容
1.5.變數
作用:給一段指定的記憶體空間起名,方便操作這段記憶體
語法:数据类型 变量名 = 初始值;
示例:
#include<iostream>
using namespace std;
int main() {
//变量的定义
//语法:数据类型 变量名 = 初始值
int a = 10;
cout << "a = " << a << endl;
return 0;
}
執行結果:
a = 10
注意:C++在建立變數時,必須給變數一個初始值,否則會報錯
1.6.常量
作用:用於記錄程式中不可更改的資料
C++定義常量兩種方式
-
#define 宏常量:
#define 常量名 常量值- ==通常在檔案上方定義==,表示一個常量
-
const修飾的變數
const 数据类型 常量名 = 常量值- ==通常在變數定義前加關鍵字const==,修飾該變數為常量,不可修改
示例:
//1、宏常量
#define day 7
int main() {
cout << "一周里总共有 " << day << " 天" << endl;
//day = 8; //报错,宏常量不可以修改
//2、const修饰变量
const int month = 12;
cout << "一年里总共有 " << month << " 个月份" << endl;
//month = 24; //报错,常量是不可以修改的
return 0;
}
執行結果:
一周里总共有 7 天
一年里总共有 12 个月份
1.7.關鍵字
**作用:**關鍵字是C++中預先保留的單詞(識別符號)
- 在定義變數或者常量時候,不要用關鍵字
C++關鍵字如下:
| asm | do | if | return | typedef |
|---|---|---|---|---|
| auto | double | inline | short | typeid |
| bool | dynamic_cast | int | signed | typename |
| break | else | long | sizeof | union |
| case | enum | mutable | static | unsigned |
| catch | explicit | namespace | static_cast | using |
| char | export | new | struct | virtual |
| class | extern | operator | switch | void |
| const | false | private | template | volatile |
| const_cast | float | protected | this | wchar_t |
| continue | for | public | throw | while |
| default | friend | register | true | |
| delete | goto | reinterpret_cast | try |
提示:在给变量或者常量起名称时候,不要用C++得关键字,否则会产生歧义。
1.8.識別符號命名規則
作用:C++規定給識別符號(變數、常量)命名時,有一套自己的規則
- 識別符號不能是關鍵字
- 識別符號只能由字母、數字、下劃線組成
- 第一個字元必須為字母或下劃線
- 識別符號中字母區分大小寫
建議:給識別符號命名時,爭取做到見名知意的效果,方便自己和他人的閱讀
2.C 與 C++ 的關係和學習路線
2.1.C 和 C++ 是什麼
C 和 C++ 都是通用的編譯型程式設計語言。除此之外,常見的程式語言 還有 Python、Rust、Go、C#(讀作 C Sharp)、Java 和 JavaScript 等; Shell 則主要用於編寫命令列和系統管理指令碼。
C++ 最初由 C 語言發展而來,因此兩者在基本語法、運算子、流程控制、 函式和指標等方面有很多相似之處。在一些同時涉及兩者的技術資料、工具鏈 和崗位描述中,人們常用“C/C++”作為合稱。
但是,C 和 C++ 現在是兩門分別制定標準、分別發展的語言,不能簡單理解 為同一門語言的兩個版本:
- C++ 不是“完全相容 C”。大部分簡單的 C 程式碼可以較容易地遷移到 C++,但仍有一些合法的 C 程式碼不能直接作為 C++ 編譯。
- C++ 不只是“帶有類的 C”。現代 C++ 還包括模板、RAII、異常、 Lambda、智慧指標、併發支援和豐富的標準庫。
- C 也不是已經被 C++ 淘汰的舊語言。作業系統、嵌入式開發、驅動、 底層庫和跨語言介面中仍然大量使用 C。
因此,C 和 C++ 既有共同基礎,也有各自適合的程式設計方式。學習其中一門 確實能幫助理解另一門,但寫 C++ 時不應只是照搬 C 風格的程式碼。
| 特性 | C 語言 | C++ 語言 |
|---|---|---|
| 語言定位 | 小而精簡,強調直接表達底層操作 | 功能更豐富,支援從底層到高層抽象 |
| 程式設計範式 | 主要採用程序式程式設計 | 多範式:過程式、物件導向、泛型、函式式等 |
| 資源管理 | 通常手動申請和釋放資源 | 支援手動管理,更推薦使用 RAII 和智慧指標 |
| 抽象與複用 | 函式、結構體、宏和模組化檔案 | 函式、類、模板、泛型演算法和標準庫 |
| 標準庫 | C 標準庫 | C++ 標準庫,也提供對大部分 C 標準庫功能的支援 |
| 型別系統 | 相對簡單,部分隱式轉換較寬鬆 | 型別系統更豐富,通常提供更嚴格的檢查 |
| 執行效率 | 適合高效能和底層開發 | 同樣適合高效能開發,合理抽象通常不會帶來額外開銷 |
| 常見場景 | 嵌入式、作業系統、驅動、底層庫 | 遊戲、圖形、機器人、桌面軟體、基礎設施和高效能運算 |
表格中的應用場景不是硬性邊界。例如,嵌入式系統也可以使用 C++,大型 應用也可能包含 C 模組。最終選擇哪門語言,要看專案需求、執行環境、 現有生態和團隊經驗。
2.2.應該先學 C,還是直接學 C++
學習 C++ 並不要求先完整學完 C。對於本教程的讀者,推薦直接按照 C++ 路線學習:
- 先掌握變數、分支、迴圈、函式、陣列和基本輸入輸出。
- 再學習引用、指標、結構體、類和物件。
- 接著學習
std::string、std::vector、迭代器和常用演算法。 - 然後理解 RAII、智慧指標、模板、Lambda 和異常處理。
- 最後結合 CMake、偵錯程式、單元測試和第三方庫完成真實工程。
如果以後需要進行嵌入式、作業系統、驅動或純 C 專案開發,再系統補充 C 語言中的陣列與指標、記憶體佈局、結構體、前處理器和手動資源管理會更有 針對性。
本教程以 C++ 為主。遇到與 C 語言共通的語法時會順帶說明,但示例會 儘量採用適合現代 C++ 的寫法,而不是把 C++ 當作 C 語言的簡單擴充套件。
2.3.補充學習資料
本教程主要負責梳理知識點、工程環境和實踐中容易遇到的問題。初學者也 可以結合以下影片或文件學習:
不同資料採用的 C++ 標準和程式碼風格可能不同。學習語法時可以參考多個 來源,但在本教程的工程中,以當前章節給出的 C++ 寫法和 CMake 配置為準。