跳到正文

Wiki

C++基礎初識

約 9 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

1.C++初識

1.1.本章執行約定

本章的程式碼示例預設在 ch1-C++开发环境与第一个工程 下載並跑通的 CMake 模板中執行。

從這一章開始,前期語法練習只改這個檔案:

src/main.cpp

每個示例都可以把程式碼複製到 src/main.cpp 中,然後重新構建並執行模板程式。

暫時不要修改這些檔案和目錄:

  1. CMakeLists.txt
  2. src/CMakeLists.txt
  3. src/lib1/
  4. 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模式:

alt text

點選左下角的build.

alt text

執行

alt text

alt text

終端輸出:

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. 單行註釋// 描述信息
    • 通常放在一行程式碼的上方,或者一條語句的末尾,==對該行程式碼說明==
  2. 多行註釋/* 描述信息 */
    • 通常放在一段程式碼的上方,==對該段程式碼做整體說明==

提示:編譯器在編譯程式碼時,會忽略註釋的內容

1.5.變數

作用:給一段指定的記憶體空間起名,方便操作這段記憶體

語法数据类型 变量名 = 初始值;

示例:

#include<iostream>
using namespace std;

int main() {

	//变量的定义
	//语法:数据类型  变量名 = 初始值

	int a = 10;

	cout << "a = " << a << endl;
	

	return 0;
}

執行結果:

a = 10

注意:C++在建立變數時,必須給變數一個初始值,否則會報錯

1.6.常量

作用:用於記錄程式中不可更改的資料

C++定義常量兩種方式

  1. #define 宏常量: #define 常量名 常量值

    • ==通常在檔案上方定義==,表示一個常量
  2. 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++ 現在是兩門分別制定標準、分別發展的語言,不能簡單理解 為同一門語言的兩個版本:

  1. C++ 不是“完全相容 C”。大部分簡單的 C 程式碼可以較容易地遷移到 C++,但仍有一些合法的 C 程式碼不能直接作為 C++ 編譯。
  2. C++ 不只是“帶有類的 C”。現代 C++ 還包括模板、RAII、異常、 Lambda、智慧指標、併發支援和豐富的標準庫。
  3. C 也不是已經被 C++ 淘汰的舊語言。作業系統、嵌入式開發、驅動、 底層庫和跨語言介面中仍然大量使用 C。

因此,C 和 C++ 既有共同基礎,也有各自適合的程式設計方式。學習其中一門 確實能幫助理解另一門,但寫 C++ 時不應只是照搬 C 風格的程式碼。

特性 C 語言 C++ 語言
語言定位 小而精簡,強調直接表達底層操作 功能更豐富,支援從底層到高層抽象
程式設計範式 主要採用程序式程式設計 多範式:過程式、物件導向、泛型、函式式等
資源管理 通常手動申請和釋放資源 支援手動管理,更推薦使用 RAII 和智慧指標
抽象與複用 函式、結構體、宏和模組化檔案 函式、類、模板、泛型演算法和標準庫
標準庫 C 標準庫 C++ 標準庫,也提供對大部分 C 標準庫功能的支援
型別系統 相對簡單,部分隱式轉換較寬鬆 型別系統更豐富,通常提供更嚴格的檢查
執行效率 適合高效能和底層開發 同樣適合高效能開發,合理抽象通常不會帶來額外開銷
常見場景 嵌入式、作業系統、驅動、底層庫 遊戲、圖形、機器人、桌面軟體、基礎設施和高效能運算

表格中的應用場景不是硬性邊界。例如,嵌入式系統也可以使用 C++,大型 應用也可能包含 C 模組。最終選擇哪門語言,要看專案需求、執行環境、 現有生態和團隊經驗。

2.2.應該先學 C,還是直接學 C++

學習 C++ 並不要求先完整學完 C。對於本教程的讀者,推薦直接按照 C++ 路線學習:

  1. 先掌握變數、分支、迴圈、函式、陣列和基本輸入輸出。
  2. 再學習引用、指標、結構體、類和物件。
  3. 接著學習 std::stringstd::vector、迭代器和常用演算法。
  4. 然後理解 RAII、智慧指標、模板、Lambda 和異常處理。
  5. 最後結合 CMake、偵錯程式、單元測試和第三方庫完成真實工程。

如果以後需要進行嵌入式、作業系統、驅動或純 C 專案開發,再系統補充 C 語言中的陣列與指標、記憶體佈局、結構體、前處理器和手動資源管理會更有 針對性。

本教程以 C++ 為主。遇到與 C 語言共通的語法時會順帶說明,但示例會 儘量採用適合現代 C++ 的寫法,而不是把 C++ 當作 C 語言的簡單擴充套件。

2.3.補充學習資料

本教程主要負責梳理知識點、工程環境和實踐中容易遇到的問題。初學者也 可以結合以下影片或文件學習:

  1. C++ 影片教程
  2. 鵬哥 C 語言影片
  3. 菜鳥教程:C 語言教程
  4. 菜鳥教程:C++ 教程

不同資料採用的 C++ 標準和程式碼風格可能不同。學習語法時可以參考多個 來源,但在本教程的工程中,以當前章節給出的 C++ 寫法和 CMake 配置為準。