c++ primer
第二章 變數和基本型別
2.1基本內建型別
有算數型別和void
型別;算數型別儲存空間大小依及其而定。
算數型別表:
型別含義
最小儲存空間
bool
布林型-
char
字元型8
wchar_t
寬字元型
16short
短整型16
int整型
16long
長整型32
float
單精度浮點型
6位有效數字
double
雙精度浮點型
10位有效數字
long double
擴充套件精度浮點型
10位有效數字
2.1.1
整型包括整數字元和布林型。
字元型:char
和wchar_t
,後者用於擴充套件字符集。
char
有些實現中當做signed
型別,而有些則被當做unsigned
型別內建型別的機器級表示:
讓儲存具有結構的基本方法是用塊來處理儲存;通常8
位作為乙個位元組(1b=8b
),32
位或4個位元組作為乙個「字」。
可以將算數型別的任何值賦值給bool
物件;0
值算數型別代表false
,非0代表true
。把乙個超出其取值範圍的值賦給乙個特定型別時:
對於unsigned
型別來說,編譯器會對該值求模然後取所得值;對於signed
型別,由不同編譯器決定實際賦的值;
c++中,把負值賦值給unsigned
物件是完全合法的,其結果是對該負數該型別的取值個數求模後的值。
在大多數機器中用long
型別進行計算所付出的執行時代價遠遠高於int
型別;而雙精度計算代價相對於單精度可以忽略。
2.2字面值常量
只有內建型別存在字面值。
整形字面值規則0
20 //decimal
024 //octal 0
(zero
)240x24 //hexadecimal
(or 0x24
)可以通過增加字尾,強制更改字面值常量型別。
浮點數字面值規則:
預設為double
型別;加字尾f
或f表示單精度;使用科學計數法時,指數用e
或e表示。
用false or true
表示布林值
用將字元放在單引號內表示字元常量;前面加字首l
表示wchar_t
型別。可以將任何字元表示為以下形式通用轉義字元:
\ooo
這裡ooo
表示三個八進位制數字。也可用十六進製制轉義字元定義字元:\xddd
字串字面值:雙引號括起來的零個或多個字元。
為了相容c
,字串字面值都由編譯器在末尾新增乙個空字元。
寬字元字面值,只需在前面新增字首l
。兩個相鄰的僅由空格、製表符、換行符分開的同為字串字面值或同為寬字元字面值,可連線成乙個新字串字面值或寬字串字面值。字串字面值和寬字串字面值連線是未定義的。
2.3c++
是一門靜態型別語言,在編譯時會作型別檢查。
2.3.2
變數名可以由字母數字先換線組成。變數名必須以字母或下劃線開頭,並且區分大小寫。
2.3.4
變數初始化規則
在函式體外定義的變數都初始化成0
,在函式體裡定義的內建型別變數不進行自動初始化。
2.3.5
宣告和定義
為了讓多個檔案訪問相同的變數,c++
區分了宣告和定義。
使用關鍵字 extern
對變數進行宣告。
乙個變數可以被宣告多次,但只能被定義一次。
如果宣告由初始化式,那麼它可被當做定義,如 extern int a = 10
;任何多個檔案中使用的變數都需要有與定義分離的宣告。在這種情況下,乙個檔案含有變數的定義,使用該變數的其他檔案則包含該變數的宣告。
2.3.6
名字的作用域
作用域:用來區分名字的不同意義的上下文稱為作用域。作用域是程式的一段區域。
2.4 const
限定符使用const
把乙個物件轉換成常量,可以提高程式的可讀性和可維護性。
因為常量在定義後就不能被修改,所以定義時必須初始化。
const
物件預設為檔案的區域性變數,通過指定const
變數為extern
,就可以在整個程式中訪問const
物件。非const
變數預設為extern
,要使變數能夠在其他的檔案中訪問,必須顯式地指定它為extern
(p50
)2.5
引用引用是一種復合型別(用其他型別定義的型別)。
每一種引用都關聯到某一其他型別,不可以定義引用的應用,但可以定義任何其他型別的引用。
初始化是指明引用指向哪個物件的唯一方法。
定義引用,如:int &r = i
;將普通的應用繫結到const
物件是不合法的。
2.6 typedef
typedef
用來定義型別的同義詞。
使用typedef
的目的:
隱藏特定型別的實現,強調使用型別的目的;
簡化複雜的型別定義
允許一種型別用於多個目的,同時使得每次使用該型別的目的明確。
2.7列舉
定義和初始化
預設地,第乙個列舉成員賦值為0
,後面成員依次增1
。列舉成員是常量,用來初始化列舉成員的必須是常量表示式。
列舉成員的值可以重複。
每個enum
都定義一種唯一的型別,列舉型別物件的初始化或賦值只能通過其列舉成員或者同一列舉型別的其他物件進行。
2.8類型別
定義類型別的最後必須有乙個分號。
定義了類也就定義了一種新的型別, 類名就是該型別的名字。
定義變數和定義資料成員不是乙個概念,由非常重要的區別。定義類的時候定義資料成員, 用定義完成的類型別定義物件的時候會根據相應的資料成員定義相應的變數。一般不能把類成員的初始化作為其定義的一部分。當定義資料成員時,只能指定該資料成員的名字和型別,類不是在類定義裡定義資料成員時初始化資料成員,而是通過稱為建構函式的特殊成員函式控制初始化。
類成員函式可以使用類的任何成員。
用class
和struct
定義類的唯一區別在於預設訪問級別:class
成員預設為private
,struct
預設為public
。2.9
標頭檔案標頭檔案一般包含類的定義,extern
變數的宣告和函式的宣告。
編譯和鏈結多個原始檔(p58
)。標頭檔案用於宣告而不是用於定義。因為標頭檔案包含在多個原始檔中,所以不應該含有變數或函式的定義。例外:標頭檔案可以定義類、值在編譯時就已經知道的const
物件(並非所有)和inline
函式。這些實體可以在多個原始檔中定義,只要每個原始檔定義是相同的。
實踐中不會有任何儲存空間用於儲存用常量表示式初始化的const
變數。如果const
常量不是用常量表示式初始化,那麼它就不應該在同檔案中定義,相反,和其他變數一樣,在乙個原始檔中定義並初始化,在同檔案中新增它的extern
。預處理器用指定的標頭檔案內容替代每個#include
,因此設計標頭檔案時,應使可以多次包含在同一原始檔中。
預處理器變數的名字在程式中必須是唯一的。任何與預處理器變數相匹配的名字的使用都關聯到該預處理器變數。
標頭檔案保護符可以避免標頭檔案的多重包含。
c primer 筆記,第二章
初始化的含義是建立變數並賦予其乙個初始值,賦值的含義是將物件當前的值擦除 初始化四種方式 int n 0 int n 用花括號稱為列表初始化,當使用列表初始化且初始值存在丟失的風險,編譯器會報錯 int n int n 0 定義於函式體外的變數被初始化為0,函式體內部的內建型別變數不被初始化,類的物...
c primer 學習筆記(第二章)
第二章 變數和基本型別 2.1基本內建型別 基本內建型別中,因為位數的不同,這些型別所表示的最大最小值也因機器的不同而不同。即 c 基本資料型別的儲存空間依機器而定 型別含義 最小儲存空間 bool 布林型 char 字元型8bit wchar t 寬字元型 16bit short 短整型16bit...
C primer學習筆記(第二章)
typedef char pstring const pstring cstr 0 這裡的const修飾的是指標,所以pstring是乙個常量指標,而不是指向常量的指標 const pstring ps 不能錯誤地替換pstring 為 char const char cstr 0 這樣將導致錯誤的...