C++的資料型別總結,不能錯過
程式碼編譯執行環境:VS2012+Win32+Debug。
1.C++資料型別簡介
C++是一種強型別語言。C++程式中的任何變數(或函式)必須遵循“先說明後使用”的原則。定義資料型別有兩個方面的作用:一是決定該型別的資料在記憶體中如何儲存,二是決定可對該型別的資料進行哪些合法的運算。
C++的資料型別分為基本資料型別和非基本資料型別。其中非基本資料型別稱為複合資料型別或構造資料型別。為了能夠體現C++語言和傳統C語言在非基本資料型別上的區別,在這裡把能夠體現物件導向特性的非基本資料型別成為建構函式型別,而將其他非基本資料型別稱為複合資料型別。C++的資料型別資料如下圖所示:
基本資料型別是C++內部預定義的,又叫內建(built-in)資料型別。非基本資料型別則是使用者根據需要按照C++語法規則建立的資料型別。在這裡,構造資料型別和複合資料型別的區別在於:構造資料型別的例項叫做物件,它是屬性和方法的集合。正真的構造資料型別是由C++語言引入的,它體現了物件導向的程式設計思想。構造資料型別的一個顯著特徵是:在生成該資料型別的一個例項的時候,會自動呼叫該型別定義的建構函式。也就是說,構造資料型別的變數的初始化工作是由建構函式完成的。
C/C++的學習裙【105+302+9869 】,無論你是小白還是進階者,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發工具,很多幹貨和技術資料分享!
注意:用基本資料型別定義變數時,型別出現在前面,變數直接跟在型別之後。但是用複合資料型別定義變數時,變數卻不一定完全位於型別之後。例如,定義一個陣列int a[8],識別符號a的資料型別是int[8],但是它出現在資料型別的中間部位。另外,定義或申明變數時,型別外一定不能加括號,例如用這種方式定義一個指標是不對的:(int*)p;,它表示的真實含義是將p轉換為int*型別,是強制型別轉換的語法形式。
2.寬字元型與單字元型
傳統的字元型char是單位元組字元型,儲存的是該字元的ASCII碼,佔用一個位元組。也可以把char理解成單位元組整型,取值範圍是-128~127。單位元組無符號整數可以用unsigned char表示,取值範圍是0-255。VC++中,如果在一個字串中包含漢字,每個漢字佔用2個位元組,每個位元組的最高位都是1,寬字元佔用多少位元組與編譯器的具體實現有關,以保證能夠儲存Unicode字元。VC++將wchar_t實現為2個位元組,2個位元組很顯然不能表示所有的Unicode字元,但是通過當前系統的語言環境進行編碼轉換,兩個位元組最大能夠表示65536個字元,足以表示某個國家的文字。單位元組字元是無法容納一個漢字字元的,如定義char c=’好’;將得到一條編譯警告資訊,並且只有低位元組編碼會存放在字元變數c中。C++語言同時支援寬字元型別(wchar_t),用於表示Unicode字元。為了支援Unicode字元的處理,C++在庫函式中定義了相應的Unicode字元的處理函式,並將這些函式的申明放在了標頭檔案中。Visual C++中whar_t和char是兩種不同的資料型別,它們的儲存結構和使用方法都不一樣。見如下例子。
程式輸出結果:
閱讀以上程式,得出如下結論:
(1)wchar_t和char是不同的資料型別,資料寬度也不一樣,sizeof(char)==1,wchar_t的資料寬度與編譯器的實現有關,再根據當前系統語言環境進行編碼轉換,足以保證儲存Unicode字元,在Visual C++中 wchar_t佔用兩個位元組。
(2)定義一個wchar_t型別的字串時,要以L開頭,否則出現編譯錯誤。定義一個wchar_t型別的字元常量,也需要以L開頭,例如wchar_t wc=L’A’,如果去掉L,編譯器會自動執行由char到wchar_t的轉換。
(3)對於西文字元(如’A’、’B’、’C’等)來說,在wchar_t型別的變數中,高位元組存放的是0x00,低位元組存放的是西文字元的ASCII碼值。
(4)char型別的字串以單位元組’\0’結束,wchar_t型別的字串以雙位元組’\0’’\0’結束。
(5)Windows7中文簡體環境中一個漢字佔用兩個位元組,採用的是GBK 編碼,所以char型別的字串中一個漢字佔用兩個位元組表示,這兩個位元組的最高位都是1,只有這樣,才能將它們與西文字元區別開來,所以將它們的ASCII碼輸出時得到兩個負數。在wchar_t型別的字串中,每個漢字都用雙位元組表示,採用的是UTF-16編碼方式,因此相同的中文字元,儲存的碼值是不同的。UTF-16編碼與ASCII編碼不相容,所以上面的程式碼中用cout輸出L”ABC”無法正常輸出。還有就是UTF-16編碼將常用的字元采用兩個位元組進行儲存,不常用的漢字採用四個位元組儲存,因此用wchar_t儲存UTF-16編碼中四個位元組的漢字會產生資料丟失,無法正確儲存。
(6)在上面的程式中,語句 cout<<name<<endl; 的輸出結果是“張三”,而語句 wcout< <wname< <endl; 卻無法正常看到輸出。如果字串wname中全是西文字元,則仍然可以看到輸出,這是在控制檯程式中的一個現象,與控制檯的預設語言環境的設定有關,即設定採用什麼編碼方式輸出。通過setlocale來設定語言環境後,進行編碼轉換,見程式中的程式碼。
相關文章
- Go 的資料型別總結Go資料型別
- Python的資料型別總結Python資料型別
- JS 資料型別總結JS資料型別
- Mysql支援的資料型別(總結)MySql資料型別
- go 基礎總結 --- 資料型別Go資料型別
- JavaScript資料型別轉換總結JavaScript資料型別
- C++資料型別C++資料型別
- 可變資料型別(mutable)與不可變資料型別(immutable)總結資料型別
- Redis中 HyperLogLog資料型別使用總結Redis資料型別
- JS基礎總結(1)——資料型別JS資料型別
- 【C++】資料型別-列舉型C++資料型別
- Python3學習(基本資料型別-集合-字典-基本資料型別總結)Python資料型別
- C++順序結構(3)、資料型別_____教學C++資料型別
- C++檢視資料型別C++資料型別
- C++除錯總結C++除錯
- C#與C++型別對應關係總結C#C++型別
- 【C++】CONST CHAR*型別的值不能用於初始化CHAR*型別的實體C++型別
- VS2019【C++報錯】E0144"const char *" 型別的值不能用於初始化 "char *" 型別的實體C++型別
- route.query型別報錯,不能將LocationQueryValue...... 分配給型別.....型別
- Java基本資料型別總結、型別轉換、常量的宣告規範,final關鍵字的用法Java資料型別
- js中其他資料型別的值轉為字串的相關總結JS資料型別字串
- Android NDK開發中java資料型別與C/C++資料型別的對應關係AndroidJava資料型別C++
- JavaScript基本型別總結JavaScript型別
- Java集合不能存放基本資料型別,只存放物件的引用Java資料型別物件
- C基本資料型別小結資料型別
- Python常用的組合資料型別彙總Python資料型別
- C++中出現《E0144 "const char *" 型別的值不能用於初始化 "char *" 型別的實體》的錯誤解決方法C++型別
- 關於Redis資料型別以及應用場景的分析與總結Redis資料型別
- Redis基本資料型別命令彙總Redis資料型別
- C++ 資料算數型別C++型別
- 向PostgreSQL資料庫插入Date型別資料包錯SQL資料庫型別
- js資料型別之基本資料型別和引用資料型別JS資料型別
- 可變資料型別不能作為python函式的引數資料型別Python函式
- 【VS2019 C++】"const char *" 型別的值不能用於初始化 "char *" 型別的實體C++型別
- 資料型別: 資料型別有哪些?資料型別
- [python] Python型別提示總結Python型別
- OOM異常型別總結OOM型別
- Redis基本資料型別底層資料結構Redis資料型別資料結構