1. 程式人生 > >C++基礎回顧1——資料型別,變數型別、儲存

C++基礎回顧1——資料型別,變數型別、儲存

最近找工作沒有好好還準備code,結果被問了很多基礎知識都不會,所以這裡要來回顧一下。

大家找工作一定要提前準備啊,好好刷題。

—————————————————————————————————————————————————————————

C++ 是一種靜態型別的、編譯式的、通用的、大小寫敏感的、不規則的程式語言,支援過程化程式設計、面向物件程式設計和泛型程式設計。

C++ 被認為是一種中級語言,它綜合了高階語言和低階語言的特點。

C++ 是 C 的一個超集,事實上,任何合法的 C 程式都是合法的 C++ 程式。

注意:使用靜態型別的程式語言是在編譯時執行型別檢查,而不是在執行時執行型別檢查。

————————————————————————————————

C++ 完全支援面向物件的程式設計,包括面向物件開發的四大特性:

  • 封裝
  • 抽象
  • 繼承
  • 多型

————————————————————————————————

標準的 C++ 由三個重要部分組成:

  • 核心語言,提供了所有構件塊,包括變數、資料型別和常量,等等。
  • C++ 標準庫,提供了大量的函式,用於操作檔案、字串等。
  • 標準模板庫(STL),提供了大量的方法,用於操作資料結構等。

————————————————————————————————————————————————————————

C++ 程式可以定義為物件的集合,這些物件通過呼叫彼此的方法進行互動。現在讓我們簡要地看一下什麼是類、物件,方法、即時變數。

  • 物件 - 物件具有狀態和行為。例如:一隻狗的狀態 - 顏色、名稱、品種,行為 - 搖動、叫喚、吃。物件是類的例項。
  • 類 - 類可以定義為描述物件行為/狀態的模板/藍圖。
  • 方法 - 從基本上說,一個方法表示一種行為。一個類可以包含多個方法。可以在方法中寫入邏輯、操作資料以及執行所有的動作。
  • 即時變數 - 每個物件都有其獨特的即時變數。物件的狀態是由這些即時變數的值建立的。

————————————————————————————————————————————————————————

下表顯示了各種變數型別在記憶體中儲存值時需要佔用的記憶體,以及該型別的變數所能儲存的最大值和最小值。

注意:

不同系統會有所差異。

型別 範圍
char 1 個位元組 -128 到 127 或者 0 到 255
unsigned char 1 個位元組 0 到 255
signed char 1 個位元組 -128 到 127
int 4 個位元組 -2147483648 到 2147483647
unsigned int 4 個位元組 0 到 4294967295
signed int 4 個位元組 -2147483648 到 2147483647
short int 2 個位元組 -32768 到 32767
unsigned short int 2 個位元組 0 到 65,535
signed short int 2 個位元組 -32768 到 32767
long int 8 個位元組 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
signed long int 8 個位元組 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned long int 8 個位元組 0 to 18,446,744,073,709,551,615
float 4 個位元組 +/- 3.4e +/- 38 (~7 個數字)
double 8 個位元組 +/- 1.7e +/- 308 (~15 個數字)
long double 16 個位元組 +/- 1.7e +/- 308 (~15 個數字)
wchar_t 2 或 4 個位元組 1 個寬字元

從上表可得知,變數的大小會根據編譯器和所使用的電腦而有所不同。

——————————————————————————————————————————————————————

typedef 宣告

您可以使用 typedef 為一個已有的型別取一個新的名字。下面是使用 typedef 定義一個新型別的語法: 

typedef type newname; 

列舉型別

列舉型別(enumeration)是C++中的一種派生資料型別,它是由使用者定義的若干列舉常量的集合。

如果一個變數只有幾種可能的值,可以定義為列舉(enumeration)型別。所謂"列舉"是指將變數的值一一列舉出來,變數的值只能在列舉出來的值的範圍內。

建立列舉,需要使用關鍵字 enum。列舉型別的一般形式為:

enum 列舉名{ 
     識別符號[=整型常數], 
     識別符號[=整型常數], 
... 
    識別符號[=整型常數]
} 列舉變數;

 ——————————————————————————————————————————————————————

變數其實只不過是程式可操作的儲存區的名稱。C++ 中每個變數都有指定的型別,型別決定了變數儲存的大小和佈局,該範圍內的值都可以儲存在記憶體中,運算子可應用於變數上。

變數的名稱可以由字母、數字和下劃線字元組成。它必須以字母或下劃線開頭。大寫字母和小寫字母是不同的,因為 C++ 是大小寫敏感的。

————————————————————————————————————————————————————————

作用域是程式的一個區域,一般來說有三個地方可以定義變數:

  • 在函式或一個程式碼塊內部宣告的變數,稱為區域性變數。

  • 在函式引數的定義中宣告的變數,稱為形式引數。

  • 在所有函式外部宣告的變數,稱為全域性變數。

————————————————————————————————————————————

定義常量

在 C++ 中,有兩種簡單的定義常量的方式:

  • 使用 #define 前處理器。
  • 使用 const 關鍵字。

#define 前處理器

下面是使用 #define 前處理器定義常量的形式:

#define identifier value

const 關鍵字

您可以使用 const 字首宣告指定型別的常量,如下所示:

const type variable = value;

—————————————————————————————————————————————————————

C++ 允許在 char、int 和 double 資料型別前放置修飾符。修飾符用於改變基本型別的含義,所以它更能滿足各種情境的需求。

下面列出了資料型別修飾符

  • signed
  • unsigned
  • long
  • short

修飾符 signed、unsigned、long 和 short 可應用於整型,signed 和 unsigned 可應用於字元型,long 可應用於雙精度型。

修飾符 signed 和 unsigned 也可以作為 long 或 short 修飾符的字首。例如:unsigned long int

C++ 允許使用速記符號來宣告無符號短整數無符號長整數。您可以不寫 int,只寫單詞 unsigned、short 或 unsigned、long,int 是隱含的。例如,下面的兩個語句都聲明瞭無符號整型變數。

unsigned x;
unsigned int y;

——————————————————————————————————————————————————————

C++ 儲存類

儲存類定義 C++ 程式中變數/函式的範圍(可見性)和生命週期。這些說明符放置在它們所修飾的型別之前。下面列出 C++ 程式中可用的儲存類:

  • auto
  • register
  • static
  • extern
  • mutable
  • thread_local (C++11)

從 C++ 11 開始,auto 關鍵字不再是 C++ 儲存類說明符,且 register 關鍵字被棄用。

static 儲存類

static 儲存類指示編譯器在程式的生命週期內保持區域性變數的存在,而不需要在每次它進入和離開作用域時進行建立和銷燬。因此,使用 static 修飾區域性變數可以在函式呼叫之間保持區域性變數的值。

static 修飾符也可以應用於全域性變數。當 static 修飾全域性變數時,會使變數的作用域限制在宣告它的檔案內。

在 C++ 中,當 static 用在類資料成員上時,會導致僅有一個該成員的副本被類的所有物件共享。

static int count = 10;

extern 儲存類

extern 儲存類用於提供一個全域性變數的引用,全域性變數對所有的程式檔案都是可見的。當您使用 'extern' 時,對於無法初始化的變數,會把變數名指向一個之前定義過的儲存位置。

當您有多個檔案且定義了一個可以在其他檔案中使用的全域性變數或函式時,可以在其他檔案中使用 extern 來得到已定義的變數或函式的引用。可以這麼理解,extern 是用來在另一個檔案中宣告一個全域性變數或函式。

extern 修飾符通常用於當有兩個或多個檔案共享相同的全域性變數或函式的時候

mutable 儲存類

mutable 說明符僅適用於類的物件,它允許物件的成員替代常量。也就是說,mutable 成員可以通過 const 成員函式修改。

thread_local 儲存類

使用 thread_local 說明符宣告的變數僅可在它在其上建立的執行緒上訪問。 變數在建立執行緒時建立,並在銷燬執行緒時銷燬。 每個執行緒都有其自己的變數副本。

thread_local 說明符可以與 static 或 extern 合併。

可以將 thread_local 僅應用於資料宣告和定義,thread_local 不能用於函式宣告或定義。