1. 程式人生 > 實用技巧 >c++ 基礎語法部分

c++ 基礎語法部分

1 this指標

c++ 程式碼轉換為c語言程式碼簡要:

注意事項:

  1. C++中this關鍵字是一個指向物件自己的一個常量指標,不能給this賦值;
  2. 只有成員函式才有this指標,友元函式不是類的成員函式,沒有this指標;
  3. 同樣靜態函式也是沒有this指標的,靜態函式如同靜態變數一樣,不屬於具體的哪一個物件;
  4. this指標作用域在類成員函式內部,在類外也無法獲取;
  5. this指標並不是物件的一部分,this指標所佔的記憶體大小是不會反應在sizeof操作符上的。

2 c++11 新特性

2.1 auto和decltype 型別推導

  1. 語法格式:
    auto varname = value;  //auto的語法格式
    decltype(exp) varname [= value];  //decltype的語法格式
    
    其中,varname 表示變數名,value 表示賦給變數的值,exp 表示一個表示式,方括號[ ]表示可有可無。
  2. 區別:
    auto 和 decltype 都會自動推匯出變數 varname 的型別:
    • auto 根據=右邊的初始值 value 推匯出變數的型別;
    • decltype 根據 exp 表示式推匯出變數的型別,跟=右邊的 value 沒有關係。
    • auto 要求變數必須初始化,也就是在定義變數的同時必須給它賦值;而 decltype 不要求,初始化與否都不影響變數的型別。因為 auto 是根據變數的初始值來推匯出變數型別的,如果不初始化,變數的型別也就無法推導。

2.2 volatile 和 const 限定符

  • const 關鍵字用來表示資料是隻讀的,也就是不能被修改;
  • volatile 和 const 是相反的,它用來表示資料是可變的、易變的,目的是不讓 CPU將資料快取到暫存器,而是從原始的記憶體中讀取。

2.3 智慧指標

2.3.1 shared_ptr

2.3.1.1 shared_ptr 建立

詳見網站:[shared_ptr]shared_ptr(https://zh.cppreference.com/w/cpp/memory/shared_ptr)

2.3.1.2 shard_ptr 功能

  • 多個 shared_ptr 物件可託管同一物件指標,系統會維護一個託管計數,當無shared_ptr託管該指標時,delete該指標
  • shared_ptr物件不能託管指向動態分配的陣列的指標,否則程式執行出錯。

2.3.2 unique_ptr

2.4 右值和move語義

  • 右值:不能取地址的表示式,不在記憶體中佔有確定位置的表示式。
  • 左值:能取地址的表示式,在記憶體中佔有確定位置的物件
  • 左值引用: 使用 "&" 表示
    int &b = num;
    
  • 右值引用:用 "&&" 表示
    int && a = 10;
    
  • move 語義:
    內部實現:
    // FUNCTION TEMPLATE move
    template <class _Ty>
    _NODISCARD constexpr remove_reference_t<_Ty>&& move(_Ty&& _Arg) noexcept { // forward _Arg as movable
        return static_cast<remove_reference_t<_Ty>&&>(_Arg);
    }
    
    物件要實現轉移建構函式。
    詳細介紹

2.5 lambda表示式

待補充

2.6 強制型別轉換

強制型別轉換說明:

強制型別轉換 說明
static_cast 用於基本型別之間、有繼承關係的類物件之間、類指標之間的轉換;
不能用於基本型別指標之間的轉換
const_cast 用於去除變數的只讀屬性;
強制轉換的目標型別必須是指標或引用
reinterpret_cast 用於指標型別之間、整數和指標型別之間的轉換,非常不安全
dynamic_cast 用於有繼承關係的類指標之間、有交叉關係的類指標之間的轉換;
具有型別檢查的功能;
需要虛擬函式的支援

注意事項:

  • static_cast 不能用於無關型別之間的轉換