首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 入門核心筆記:從基礎語法到類別設計

     編輯:關於C++

C++ 基礎語法與環境

標頭檔與命名空間

標準 C++ 標頭檔不含 .h 後綴(如 <iostream>)。C 標頭檔建議改為 c 前綴形式(<cstdio>、<cmath>)。標準庫所有符號置於 std 命名空間,使用時需加 std:: 前綴,或以 using namespace std; 一次引入。

輸入輸出與編譯

  • 標準串流:cin >> var、cout << data,支援鏈式操作。
  • 副檔名:.cpp、.C、.cc、.cxx。
  • 編譯:g++ 或 gcc -lstdc++。
  • 註解:/* */ 區塊註解、// 單行註解。

命名空間進階

命名空間解決符號衝突。可巢狀定義:namespace A { namespace B { int x; } },存取為 A::B::x。using namespace A; 導入整個空間;using A::x; 僅導入特定符號。全域命名空間以 :: 存取(如 ::var)。

型別系統增強

基本型別差異

  • bool:真正布林型別(C99 引入),true/false,轉整數為 1/0。非零即真。
  • 字元字面值:C++ 中 sizeof('X') == 1(C 語言為 4)。
  • void*:嚴格禁止隱式轉換為其他指標型別,體現強型別特性。

型別轉換新語法

C++ 提供四種具體轉換運算子,取代 C 風格強制轉型:

  • static_cast<T>(expr):數值型別互轉、void* 與具體指標互轉。
  • reinterpret_cast<T>(expr):位元重新解讀,如指標轉整數、不同指標型別互轉。
  • const_cast<T>(expr):移除 const/volatile 資格。
  • dynamic_cast:執行期多態轉型(後文詳述)。

函式增強特性

  • 預設引數:由右至左指定,宣告處給定,定義處省略。
  • 函式多載:同名函式參數表不同(型別、個數、順序),與回傳型別無關。const 屬性可構成多載。
  • 內聯函式:inline 建議編譯器展開呼叫點程式碼,避免呼叫開銷,替代巨集函式,具型別安全且無副作用。類別內定義的成員函式預設為內聯。
  • 參考傳遞:Type& name = init; 本質為指標別名,必須初始化且不可重繫結。參考非新型別,而是傳遞語意。const 參考可綁定暫時物件。

動態記憶體管理

  • new Type、new Type(init)、new Type[n] 配置記憶體,失敗拋出 bad_alloc;new (nothrow) Type 失敗回傳 nullptr。
  • delete ptr、delete[] ptr 釋放,需與 new/new[] 配對。delete nullptr 安全無效。
  • 定位 new:new (address) Type 在指定位址建構物件(少用)。

類別與物件導向基礎

封裝與存取控制

class 預設 private(封裝隱藏);struct 預設 public(相容 C)。成員函式定義於類外時以 ClassName::funcName 指定。建議類別拆分為 .h(宣告)與 .cpp(實作)。

建構子與解構子

  • 建構子:同類別名稱、無回傳型別、可多載。未定義時編譯器產生預設無參建構子;一旦自訂建構子,預設建構子不再自動生成。
  • 初始化清單:ClassName::ClassName(int x) : member(x), constMember(10), refMember(r) { } 初始化 const、參考成員及成員物件,效率更高。
  • 解構子:~ClassName(),無參、不可多載。未定義時編譯器產生空解構子。釋放物件自有記憶體後執行解構子本體,可釋放額外資源。
  • 物件生命週期:全域/靜態區域物件於 main 前後建構/解構;區域物件於作用域進出時建構/解構;動態物件由 new/delete 控制;暫時物件於完整運算式結束時銷毀。

this 指標與靜態成員

  • this:ClassName* const,指向呼叫成員函式的物件。*this 為物件本身。const 成員函式中 this 型別為 const ClassName* const。
  • 靜態成員:static 成員屬於類別而非物件。靜態資料成員須在類外定義初始化(int ClassName::staticVar = 0;)。靜態成員函式無 this,僅能存取靜態成員。

運算子多載

基本規則

  • 運算子視為函式:operator@。參數對應運算元,回傳值對應結果。
  • 至少一個運算元為使用者定義型別。不可改變優先順序、結合性、運算元個數。不可建立新運算子。. .* :: ?: sizeof typeid 及四種轉型運算子不可多載。

兩種定義形式

  • 全域函式:RetType operator@(Operand1, Operand2)。需為 friend 才能存取私有成員。operator<</operator>> 必須為全域函式(左運算元為串流物件)。
  • 成員函式:RetType ClassName::operator@(Operand2),左運算元隱含為 *this。[] () = -> 型別轉換 必須為成員函式。

關鍵運算子實作要點

  • 指派運算子:ClassName& operator=(const ClassName&)。預設逐成員指派。若含指標成員指向動態記憶體,必須自訂實作深度複製(三大件:拷貝建構子、指派運算子、解構子)。回傳 *this 支援鏈式指派。
  • 型別轉換運算子:operator TypeName(),無回傳型別、無參數、必須為成員函式。
  • 函式呼叫運算子:RetType operator()(Params),參數個數不定。支援此運算子的物件稱函式物件。
  • 遞增遞減:前置版本回傳參考 T& operator++();後置版本需虛設參數 T operator++(int),回傳舊值副本。
  • 位址運算子:T* operator->() 回傳內部物件位址,編譯器再遞迴套用 ->。
  • new/delete:多載負責原始記憶體配置/釋放,編譯器自動安插建構/解構呼叫。new[]/delete[] 為獨立運算子。

拷貝建構子與匿名物件

  • 拷貝建構子:ClassName(const ClassName&)。以同類別物件初始化新物件時呼叫。預設逐成員複製。含指標成員指向動態記憶體時,必須自訂實作深度複製。
  • 匿名物件:ClassName(args); 無變數名,語句結束即銷毀。單參數建構子可隱式型別轉換,explicit 關鍵字可禁止。
  • 零初始化:TypeName() 產生零值或匿名物件。

進階類別特性

  • const 物件僅能呼叫 const 成員函式。mutable 成員允許在 const 物件/函式中修改。
  • 友元:friend 函式/類別可存取私有/保護成員。友元非成員、單向、不傳遞。
  • 巢狀類別:類別內定義類別,常用於實作細節封裝與避免名稱衝突。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved