c premier 變數和基本型別

2021-06-08 15:52:54 字數 2880 閱讀 2003

呵呵,要重新拾起c++啦。也在這個過程中深入了解一種語言的定義吧。希望能夠通過這本書,把c++真正熟悉起來。這段日子對steve jobs的stay hungry, stay foolish有了一種更深的理解。現在我要從基礎開始!

變數和基本型別中需要注意的點:

1. 反斜槓("\")的使用

std::cou\

t << "hi」 << st\

d::endl;

等價於
std::cout<<"hi"《但是必須注意的是,反斜槓符號必須是該行的尾字元——不允許後面有注釋或空格。

2. 初始化和賦值是不同的操作。(有關這一點,我現在也沒有看到更多的解釋,但希望強化這個問題的概念,書的後面應該會解釋的)。

3. 定義和宣告的區別(這個在c專家程式設計裡面也有提到)

定義用於為變數分配儲存空間,還可以為變數指定初始值。在乙個程式中,變數有且僅有乙個定義。

宣告用於向程式表明變數的型別和名字(所以定義也是乙個宣告),可以通過使用extern關鍵字宣告變數而不定義它。

4. 引用(&)

引用只是它繫結的物件的另乙個名字,作用在引用上的所有操作都是事實上作用在該引用繫結的物件上。

const引用是 指向const物件的引用。(這一點在c專家程式設計中,有過與指標相關的論述)

const int ival = 1023;

const int& refval = ival; //valid

int& refval2 = ival; //error

試想,如果最後一條語句可以使用的話,原先作為不可修改的變數ival現在豈不是可以通過refval2進行修改了?所以最後一條語句不合法。

另外,const引用可以初始化為不同型別的物件或初始化為右值,如:

int i=42;

const int &r = 42;

const int &r2 = i+2;

double dval = 3.14;

const int &ri = dval;

//編譯器會把這些最後兩句**轉換成:

int temp = dval; //先轉型

const int& ri = temp;

如果ri不是const,那麼可以給ri賦一新值,這樣做不會修改dval(因為實際上ri指向的是temp),而是修改了temp,期望對ri的賦值會修改dval的程式設計師會發現dval並沒有被修改。

因此,非const引用只能繫結到與該引用同型別的物件,而const引用則可以繫結到不同但相關的型別的物件或繫結到右值。

5. c++中的struct和class

c++中,用class和struct關鍵字定義的唯一差別在於預設訪問級別:預設情況下,struct的成員為public,而class的成員了private。

(現在我有個問題就是,struct中也可以定義方法嗎?希望後續的閱讀能夠找到答案)

6. const物件預設為檔案的區域性變數

2.4中的第2點我不是很確定。按照書中的說法,非const變數預設為extern,要使const變數能夠在其他的檔案中訪問,必須顯式地指定它為extern。(先記在這裡了)

7. 標頭檔案用於宣告而不是用於定義

//下面的語句都是定義,所以不應該放在標頭檔案裡

extern int ival = 10; //已經初始化,所以是定義

double fica_rate; //沒有extern,所以是乙個定義

因為標頭檔案包含在多個原始檔中,所以不應該含有變數或函式的定義。

對於標頭檔案不應該含有定義這一規則,有三個例外,標頭檔案可以定義類、值在編譯時就已經知道的const物件和inline函式,這是因為編譯器需要它們的定義(不只是宣告)來產生**。例如:為了產生能夠定義或使用類的物件的**,編譯器需要知道組成該型別的資料成員。同樣還需要知道能夠在這些物件上執行的操作。類定義提供所需要的資訊。

8. 定義在標頭檔案中的const物件

前面說過const變數預設時是定義該變數的檔案的區域性變數,「正如我們現在所看到的,這樣設定預設情況的原因在於允許 const變數定義在標頭檔案中」。(似乎正回答了我前面提到的問題。。。)

下面有一段推理,「一般來說,常量表示式是編譯器在編譯時就能夠計算出結果的表示式。當const整型變數通過常量表示式自我初始化時,這個const整型變數就可能是常量表示式。而const變數要成為常量表示式,初始化式必須為編譯器可見。為了能夠讓多個檔案使用相同的常量值,const變數和它的初始化式必須是每個檔案可見的。而要使初始化式可見,一般都把這樣的const變數定義在標頭檔案中。」

這種行為有乙個很重要的含義:當我們在標頭檔案中定義了const變數後,每個包含該標頭檔案的原始檔都有了自己的const變數,其名稱和值都一樣。

9. 標頭檔案保護符(header guard)

標頭檔案經常#include其他標頭檔案,例如我們自定義的類self的標頭檔案可能會包含string標頭檔案,而使用該自定義的類的檔案main.c也可能會包含string標頭檔案。這種情況下,main.c不會也不應該知道self標頭檔案中包含了string標頭檔案。因此,設計標頭檔案時,應使其可以多次包含在同乙個原始檔中,我們必須保證多次包含同一標頭檔案不會引起該標頭檔案定義的類和物件被多次定義。使得標頭檔案安全的通知做法,是使用預處理器定義標頭檔案保護符。

#ifndef self_h

#define self_h

//here goes the definition

...#endif

為了保證標頭檔案在給定的資源中只處理過一次,我們首先檢測#ifndef。第一次處理標頭檔案時,測試會成功,因為self_h還未定義。下一條語句定義了self_h,那樣的話,如果我們編譯的檔案恰好又一次包含了該標頭檔案,#ifndef指示會發現self_h已經定義,並且忽略該標頭檔案的剩餘部分。

變數和基本型別

算術型別 arithmetic type c 標準規定了每個算術型別的最小儲存空間,但允許編譯器使用更大的儲存空間。事實上,對於int型,幾乎現在所有的編譯器使用的儲存空間都比所要求的大 也表明,在編寫程式時不能對這些型別的大小做任何假設 c 算術型別最小儲存空間規定如下 注 要特別注意int型,並...

變數和基本型別

c 程式通常由許多檔案組成,為了讓多個檔案訪問相同的變數,c 區分了宣告和定義。變數的定義 definition 用於為變數分配儲存空間,還可以為變數指定初始值。在乙個程式中,變數有且僅有乙個定義。c 支援兩種初始化變數的形式 複製初始化 copy initialization 和直接初始化 dir...

變數和基本型別

一 資料型別 c 主要有bool,char,short,int,long,long long float,double,long double,wchar t 寬字元 char16 t char32 t unicode字元 每個型別對應不同的位元組尺寸,以上型別都是有符號的,加上關鍵字unsigne...