C++學習筆記——001

不是公子的小白發表於2024-03-16
  • C++ 是一種靜態型別的、編譯式的、通用的、大小寫敏感的、不規則的程式語言,支援過程化程式設計、物件導向程式設計和泛型程式設計。C++ 是 C 的一個超集,事實上,任何合法的 C 程式都是合法的 C++ 程式。注意:使用靜態型別的程式語言是在編譯時執行型別檢查,而不是在執行時執行型別檢查。

  • <> 先去系統目錄中找標頭檔案,如果沒有再到當前目錄下找。所以像標準的標頭檔案 stdio.h、stdlib.h 等用這個方法。" " 首先在當前目錄下尋找,如果找不到,再到系統目錄中尋找。這個用於 include 自定義的標頭檔案,讓系統優先使用當前目錄中定義的。

  • 標準規範中規定 main 函式的返回值為 int,一般約定返回 0 值時代表程式執行無錯誤,其它值均為錯誤號,但該約定並非強制。

  • 塊註釋符(/*...*/)是不可以巢狀使用的。

  • 在實際專案中,為了防止將“==”誤寫作“=”,推薦將變數名寫在右側,編譯器可以幫助尋找錯誤。

  • 全域性變數和和區域性變數同名時,可加域名解析在函式中引用到全域性變數,不加域名解析則引用區域性變數:
#include<iostream>
using namespace std;


int a = 10;


int main()
{
    int a = 20;
    cout << ::a << endl;   // 10
    cout << a << endl;     // 20
    return 0;
}

auto x1 = 5, x2 = 5.0, x3='r';  //錯誤,必須是初始化為同一型別

C++ 全域性變數、區域性變數、靜態全域性變數、靜態區域性變數的區別

從作用域看:全域性變數具有全域性作用域。全域性變數只需在一個原始檔中定義,就可以作用於所有的原始檔。當然,其他不包含全域性變數定義的原始檔需要用extern關鍵字再次宣告這個全域性變數。靜態區域性變數具有區域性作用域,它只被初始化一次,自從第一次被初始化直到程式執行結束都一直存在,它和全域性變數的區別在於全域性變數對所有的函式都是可見的,而靜態區域性變數只對定義自己的函式體始終可見。區域性變數也只有區域性作用域,它是自動物件(auto),它在程式執行期間不是一直存在,而是隻在函式執行期間存在,函式的一次呼叫執行結束後,變數被撤銷,其所佔用的記憶體也被收回。靜態全域性變數也具有全域性作用域,它與全域性變數的區別在於如果程式包含多個檔案的話,它作用於定義它的檔案裡,不能作用到其它檔案裡,即被static關鍵字修飾過的變數具有檔案作用域。這樣即使兩個不同的原始檔都定義了相同名字的靜態全域性變數,它們也是不同的變數。

從分配記憶體空間看:全域性變數,靜態區域性變數,靜態全域性變數都在靜態儲存區分配空間,而區域性變數在棧裡分配空間。

從以上分析可以看出, 把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數後是改變了它的作用域,限制了它的使用範圍。因此static 這個說明符在不同的地方所起的作用是不同的。應予以注意。

宏定義 #define 和常量 const 的區別

型別和安全檢查不同:宏定義是字元替換,沒有資料型別的區別,同時這種替換沒有型別安全檢查,可能產生邊際效應等錯誤;const常量是常量的宣告,有型別區別,會在編譯階段進行型別檢查;

編譯器處理不同:宏定義是一個"編譯時"概念,在預處理階段展開,不能對宏定義進行除錯,生命週期結束於編譯時期;const常量是一個"執行時"概念,在程式執行使用,類似於一個只讀資料;

儲存方式不同:宏定義是直接替換,不會分配記憶體,儲存於程式的程式碼段中;const常量需要進行記憶體分配,儲存於程式的資料段中;

定義域不同:

void f1 ()
{
    #define N 12
    const int n 12;
}


void f2 ()
{
    cout<<N <<endl; //正確,N已經定義過,不受定義域限制
    cout<<n <<endl; //錯誤,n定義域只在f1函式中
}

定義後能否取消:宏定義可以透過#undef來使之前的宏定義失效;const常量定義後將在定義域內永久有效;

void f1()
{
    #define N 12
    const int n = 12;


    #undef N //取消宏定義後,即使在f1函式中,N也無效了
    #define N 21//取消後可以重新定義
}

是否可以做函式引數:宏定義不能作為引數傳遞給函式;const常量可以在函式的引數列表中出現。

register 儲存類

register 儲存類用於定義儲存在暫存器中而不是 RAM 中的區域性變數。這意味著變數的最大尺寸等於暫存器的大小(通常是一個詞),且不能對它應用一元的 '&' 運算子(因為它沒有記憶體位置)。

{
    register int miles;
}

暫存器只用於需要快速訪問的變數,比如計數器。還應注意的是,定義 'register' 並不意味著變數將被儲存在暫存器中,而是有可能儲存在暫存器中,這取決於硬體和實現的限制。(計算機做運算時,必須將資料讀入暫存器才能運算)

掃碼關注公眾號,檢視更多精彩內容

相關文章