C++基礎初識
C++初識
本章運行約定
本章的代碼示例默認在 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 模板。寫到這裏時,你的工程大致還是這個結構.
第一個C++程序
打開工程中的:
src/main.cpp
把內容替換爲:
#include <iostream>
using namespace std;
int main()
{
// 程序从 main 函数开始执行,下面的语句会按顺序运行。
cout << "Hello world" << endl;
// 返回 0 表示程序正常结束。
return 0;
}
運行結果:
Hello world
構建並運行程序
在工程根目錄執行:(或者直接用上一節講的圖形化界面編譯,下面也會再教你一下)
cmake --build --preset linux-debug
./build/linux-debug/src/cmake_template
圖形化步驟:
配置成build+debug模式:

點擊左下角的build.

運行


終端輸出:
Hello world
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]開始讀取用戶輸入的內容。
註釋
作用:在代碼中加一些說明和解釋,方便自己或其他程序員程序員閱讀代碼
兩種格式
- 單行註釋:
// 描述信息- 通常放在一行代碼的上方,或者一條語句的末尾,==對該行代碼說明==
- 多行註釋:
/* 描述信息 */- 通常放在一段代碼的上方,==對該段代碼做整體說明==
提示:編譯器在編譯代碼時,會忽略註釋的內容
變量
作用:給一段指定的內存空間起名,方便操作這段內存
語法:数据类型 变量名 = 初始值;
示例:
#include<iostream>
using namespace std;
int main() {
//变量的定义
//语法:数据类型 变量名 = 初始值
int a = 10;
cout << "a = " << a << endl;
return 0;
}
運行結果:
a = 10
注意:C++在創建變量時,必須給變量一個初始值,否則會報錯
常量
作用:用於記錄程序中不可更改的數據
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 个月份
關鍵字
**作用:**關鍵字是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++得关键字,否则会产生歧义。
標識符命名規則
作用:C++規定給標識符(變量、常量)命名時,有一套自己的規則
- 標識符不能是關鍵字
- 標識符只能由字母、數字、下劃線組成
- 第一個字符必須爲字母或下劃線
- 標識符中字母區分大小寫
建議:給標識符命名時,爭取做到見名知意的效果,方便自己和他人的閱讀
C 與 C++ 的關係和學習路線
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 模塊。最終選擇哪門語言,要看項目需求、運行環境、 現有生態和團隊經驗。
應該先學 C,還是直接學 C++
學習 C++ 並不要求先完整學完 C。對於本教程的讀者,推薦直接按照 C++ 路線學習:
- 先掌握變量、分支、循環、函數、數組和基本輸入輸出。
- 再學習引用、指針、結構體、類和對象。
- 接着學習
std::string、std::vector、迭代器和常用算法。 - 然後理解 RAII、智能指針、模板、Lambda 和異常處理。
- 最後結合 CMake、調試器、單元測試和第三方庫完成真實工程。
如果以後需要進行嵌入式、操作系統、驅動或純 C 項目開發,再系統補充 C 語言中的數組與指針、內存佈局、結構體、預處理器和手動資源管理會更有 針對性。
本教程以 C++ 爲主。遇到與 C 語言共通的語法時會順帶說明,但示例會 儘量採用適合現代 C++ 的寫法,而不是把 C++ 當作 C 語言的簡單擴展。
補充學習資料
本教程主要負責梳理知識點、工程環境和實踐中容易遇到的問題。初學者也 可以結合以下視頻或文檔學習:
不同資料採用的 C++ 標準和代碼風格可能不同。學習語法時可以參考多個 來源,但在本教程的工程中,以當前章節給出的 C++ 寫法和 CMake 配置爲準。