第 2 節

C++基礎初識

0瀏覽次數0訪問次數--跳出率--平均停留

C++初識

本章運行約定

本章的代碼示例默認在 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 模板。寫到這裏時,你的工程大致還是這個結構.

第一個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模式:

alt text

點擊左下角的build.

alt text

運行

alt text

alt text

終端輸出:

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] 開始讀取用户輸入的內容。

註釋

作用:在代碼中加一些説明和解釋,方便自己或其他程序員程序員閲讀代碼

兩種格式

  1. 單行註釋// 描述信息
    • 通常放在一行代碼的上方,或者一條語句的末尾,==對該行代碼説明==
  2. 多行註釋/* 描述信息 */
    • 通常放在一段代碼的上方,==對該段代碼做整體説明==

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

變量

作用:給一段指定的內存空間起名,方便操作這段內存

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

示例:

#include<iostream>
using namespace std;

int main() {

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

    int a = 10;

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

    return 0;
}

運行結果:

a = 10

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

常量

作用:用於記錄程序中不可更改的數據

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 个月份

關鍵字

**作用:**關鍵字是C++中預先保留的單詞(標識符)

  • 在定義變量或者常量時候,不要用關鍵字

C++關鍵字如下:

asmdoifreturntypedef
autodoubleinlineshorttypeid
booldynamic_castintsignedtypename
breakelselongsizeofunion
caseenummutablestaticunsigned
catchexplicitnamespacestatic_castusing
charexportnewstructvirtual
classexternoperatorswitchvoid
constfalseprivatetemplatevolatile
const_castfloatprotectedthiswchar_t
continueforpublicthrowwhile
defaultfriendregistertrue
deletegotoreinterpret_casttry

提示:在给变量或者常量起名称时候,不要用C++得关键字,否则会产生歧义。

標識符命名規則

作用:C++規定給標識符(變量、常量)命名時,有一套自己的規則

  • 標識符不能是關鍵字
  • 標識符只能由字母、數字、下劃線組成
  • 第一個字符必須為字母或下劃線
  • 標識符中字母區分大小寫

建議:給標識符命名時,爭取做到見名知意的效果,方便自己和他人的閲讀

C 與 C++ 的關係和學習路線

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 模塊。最終選擇哪門語言,要看項目需求、運行環境、 現有生態和團隊經驗。

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

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

  1. 先掌握變量、分支、循環、函數、數組和基本輸入輸出。
  2. 再學習引用、指針、結構體、類和對象。
  3. 接着學習 std::stringstd::vector、迭代器和常用算法。
  4. 然後理解 RAII、智能指針、模板、Lambda 和異常處理。
  5. 最後結合 CMake、調試器、單元測試和第三方庫完成真實工程。

如果以後需要進行嵌入式、操作系統、驅動或純 C 項目開發,再系統補充 C 語言中的數組與指針、內存佈局、結構體、預處理器和手動資源管理會更有 針對性。

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

補充學習資料

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

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

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

音乐页