第2章:變量和基本類型

轉載請註明原文出處:http://blog.csdn.net/roddick621

以下的知識點全部都是來自於C++ Primer 第四版,如果需要詳細瞭解的話,可以查看原版的書籍。


1.基本內置類型

類型 含義 最小存儲空間
bool 布爾型 --
char 字符型 8位
wchar_t 寬字符型 16位
short 短整型 16位
int 整型 16位
long 長整型 32位
float 單精度浮點型 6位有效數字(32位)
double 雙精度浮點型 10位有效數字(64位)
long double 擴展精度浮點型 10位有效數字(96/128位)

1.1整型

    表示整數、字符(char和schar_t)和布爾型的算術類型合稱爲整型(integral type)。

    除了bool類型外,整型是可以帶符號的(signed),也可以是無符號的(unsigned)。無符號類型中,所有位數都表示數值。如果在某種機器中,定義了一種類型使用8位表示,那麼這種類型的unsigned型就可以表示0-255(2^8-1)。如果是有符號的話,它需要用一位來表示符號位,符號位爲1,值爲負數,符號位爲0,值位整數。所以有符號數表示的範圍就爲-(2^7-1)到(2^7-1)。


1.2浮點型

    類型float、double和long double分別用於表示單精度浮點數、雙精度浮點數和擴展精度浮點數。


2.字面值常量

    像42這樣的值,在程序中被當作爲字面值常量。稱之爲字面值是因爲它只能夠用它的值來稱呼它,稱之爲常量是因爲它的值不可以改變。

2.1整型字面值規則

     可以用三種進制的格式 :

20:十進制

024:八進制

0x14:十六進制

    字面值常量的類型默認爲int或者long(根據需要而定),或者可以通過增加後綴轉換爲long,unsigned或者unsigned long類型。eg:128u(unsigned),1024UL(unsigned long),1L(long)

2.2浮點字面值規則

    通常可以用十進制或者科學計數法來表意。科學計數法的指數使用E或者e來表示。默認的浮點字面值常量爲double類型。在後面加上F或者f表示單精度。加上L或者l表示擴展精度。

2.3布爾字面值和字符字面值

    單詞true和false是布爾型的字面值。在字符字面值前加L就能夠得到wchar_t類型的寬字符字面值。

2.4非打印字符的轉義序列。

換行符 \n 水平製表符 \t
縱向製表符 \v 退格符 \b
回車符 \r 退紙符 \f
報警符 \a 反斜線 \\
疑問號 \? 單引號 \'
雙引號 \"  
   

2.5字符串字面值

    字符串字面值常量用雙引號括起來的零個或者多個字符表示。不可打印字符表示成相應的轉義字符。爲了兼容C語言,C++中所有的字符串字面值都由編譯器自動在末尾添加一個空字符\0。

2.6字符串字面值的連接

    兩個相鄰的僅由空格、製表符或換行符分開的字符串字面值,可以連接成一個新的字符串字面值。


3.變量

    變量提供了程序可以操作的有名字的存儲區。C++中的每一個變量都有特定的類型,該類型決定了變量的內存大小和佈局、能夠存儲於該內存中的值的取值範圍以及可陰功在該變量上的操作集。C++程序員常常把變量成爲“變量”或者“對象”。

左值(lvalue):左值可以出現在賦值語句的左邊或者右邊。

右值(rvalue):右值只可以出現在賦值的右邊,不能出現在賦值語句的左邊。

3.1變量名

    變量名,即變量的標識符,可以由字幕、數字和下劃線組成。變量名必須以字幕或者下劃線開頭,並且區分大小寫。並且C++保留了一組詞作爲該語言的關鍵字,關鍵字也不能作爲程序的標識符。

3.1.1定義對象

     每個定義都是以類型說明符開始,後面緊跟着以逗號分開的含有一個或者多個說明符的列表,分號結束定義。eg: int units_sold;

3.1.2初始化

     變量定義指定了變量的類型和標識符,也可以爲對象提供初始值。定義時指定了初始值的對象被稱爲是已初始化的。C++提供的複製初始化直接初始化。複製初始化語法用等號(int ival=1024),直接初始化是把初始化式放在括號中(int ival(1024))。對於內置類型來說,複製初始化和直接初始化幾乎沒有差別。對於類類型的對象來說,有些初始化僅能用直接初始化來完成。

3.1.3變量初始化規則

    當定義的沒有初始化式的變量時,系統有時候會幫我們初始化變量。初始化什麼樣的值取決於變量的類型,也取決於變量的位置。

1.內置類型變量的初始化。內置類型變量是否初始化取決於變量的位置。在函數體外定義的變量都初始化爲0,在函數體類定義的內置類型不進行自動初始化。

2.類類型變量的初始化。類中都有一個默認構造函數,無論變量在哪裏定義,如果沒有初始化,都會調用這個函數進行初始化。

3.1.4聲明和定義

C++通常又許多文件組成,爲了讓多個文件訪問相同的變量,C++區分了聲明和定義。

定義(definition):用於爲變量分配存儲空間,還可以爲變量指定初始值。在一個程序中,變量有且僅有一個定義。

聲明(declaration):用於向程序聲明變來那個的類型和名字。定義也是聲明:當定義變量時我們聲明瞭它的類型和名字。可以通過使用extern關鍵字聲明變量名而不定義它。不定義變量的聲明包括對象名、對象類型和對象類型前的關鍵字extern。例如:extern int i;(這裏就是隻作聲明,不作定義)。extern聲明不是定義,也不會分配存儲空間。事實上,它只是說明了變量定義在程序的其他地方。程序中變量可以聲明多次,但只能夠定義一次。只有當聲明也是定義時,聲明纔可以有初始化,因爲只有定義才分配存儲空間。如果聲明有初始化,那麼它可以被當作是定義,幾時聲明標記爲extern。eg: extern double pi=3.1416; 雖然使用了extern,但是這條數據還是定義了pi,分配並且初始化了存儲空間。只有當extern聲明位於函數外不是,纔可以函數初始化式。

3.1.5名字的作用域

用來區分名字的不同意義的上下文成爲作用域(scope),作用域是程序的一段區域,一個名稱可以和不同作用域中的不同實體相關聯。

全局作用域(golbal scope):在所有函數外部的名字,可以在程序中任何地方訪問。

局部作用域(local scope)

語句作用域(statement scope)


4.const限定符

4.1定義const對象

const提供了把一個對象轉換成一個常量的方法。


4.2const對象默認爲文件的局部變量

在全局作用域裏定義非const變量時,它的整個程序中都可以訪問(非const對象默認爲extern):

//file_1.cpp
int counter; //definition

//file_2.cpp
extern int counter; //uses counter from file_1
++counter; //increments counter defined in file_1
與其他變量不同,除非特別說明,在全局作用域聲明的const變量是定義該對象的文件的局部變量。此變量只存在於那個文件中,不能被其他文件訪問。通過指定const變量爲extern,纔可以在整個程序中訪問const對象:

//file_1.cpp
extern const int bufSize = fcn(); //defines and initializes

//file_2.cpp
extern const int bufSize; //uses bufSize from file_1
for (int index=0; index != bufSize; ++index)
    //...


5.引用

    引用(reference)就是對象的另一個名字。在實際程序中,引用主要用作函數的形式參數。引用是一種複合類型(compound type),通過在變量名前添加“&”符號來定義。複合類型是指用其他類型定義的類型。

    eg:  int ival = 1024;   int $refVal = ival;


6.typedef名字

    typedef定義以關鍵字typedef開始,後面是數據類型和標識符(eg : typedef double wages; wages hourly , weekly;  //定義了double類型的hourly和weekly) 。標識符或者類型名並沒有引入新的類型,而只是現在數據類型的同義詞。typedef名字可以出現在程序中類型名可出現的任何位置。typedef通常被用於一下三種目的:

    爲了隱藏特定類型的實現,強調使用類型的目的。

    簡化複雜的類型定義,使其更容易理解。

    允許一種類型用於多個母的,同事使得每次使用該類型的目的明確。


7.枚舉

    枚舉(enumeration)定義了整數整數常量集,而且還把他們聚集成組。

7.1定義和初始化枚舉。

    枚舉的定義包括關鍵字額怒罵,氣候是一個可選的枚舉類型名,和一個用花括號括起來,用逗號分開的枚舉成員列表。 eg : enum open_modes {input, output, append};  默認地第一個枚舉成員賦值爲0,後面的每個枚舉成員賦的值比前面的大1。

7.2枚舉成員是常量。

    可以爲一個或多個枚舉成員提供初始值,用來初始化枚舉成員的值必須是一個常量表達式(constant expression)。

//shape is 1, sphere is 2, cylinder is 3, polygon is 4
enum Forms {share=1, sphere, cylinder, polygon};
//point2d is 2, point2w is 3, point3d is 3, point3w is 4
enum Points {point2d=2, pint2w, point3d=3,point3w};

7.3每個enum都定義了一種唯一的類型。

    每個enum都定義了一種新的類型。和其他類型一樣,可以定義和初始化Point類型的對象,也可以以不同的方式來使用這些對象。枚舉類型的對想的初始化或賦值,只能通過其枚舉成員或同一枚舉類型的其他對象來進行。


8.類類型

    C++中,通過定義類(class)來自定義數據類型。類定義了該類型的對象包含的數據和該類型的對性愛那個可以執行的操作。

8.1從操作開始設計類。

    每個類都定義了一個接口(interface)貨一個實現(implementation)。接口由使用該類的代碼需要執行的操作組成。實現一般包含該類所需要的數據。實現還包括了定義該類需要的但又不供一般性使用的函數。定義類時,通常先定義該類的接口,即該類所提供的操作。通過這些操作,可以決定該類完成其功能所需要的數據,以及是否需要定義一些函數來支持該類的實現。

8.2定義類

    類定義以關鍵字class開始,其後是該類型的名字和標識符。累體位於花括號裏面。花括號後面必須要跟一個分號。

class Sales_item {
public:
    // operations on Sales_item objects will go here
private:
    std::string isbn;
    unsigned units_sold;
    double revenue;
};

8.3類的數據成員。

    定義類的數據成員和定義普通的變量有些相似。但是定義變量和定義數據成員存在非常重要的區別:一半不能把數據成員的初始化作爲定義的一部分。當定義數據成員時,只能指定數據成員的名字和類型。類不是在類定義裏定義數據成員時初始化的,而是通過成爲構造函數的特殊成員函數控制初始化。

8.4訪問標號

    訪問標號負責控制使用該類的代碼是否可以使用指定的成員。類的成員函數可以使用類的任何成員,而不管起訪問級別。類中publie部分定義的成員在程序的任何部分都可以訪問。不是類的組成部分不能訪問private成員。

8.5使用struct關鍵字。

    C++只是另一個關鍵字struct,它也可以定義類類型。如果使用class關鍵字定義類,那麼定義在第一個訪問標號前的任何成員都飲食定義爲private;如果使用struct關鍵字,那麼這些成員都是public。使用class還是struct關鍵字來定義類,僅僅影響默認初始訪問級別。


9.編寫自己的頭文件。

9.1設計自己的頭文件。

    頭文件爲相關聲明提供了一個集中存放的位置。文件件一邊包含類的定義、extern變量的聲明和函數的聲明。頭文件的正確使用能夠帶來兩個好處:保證所有文件使用給定實體的同一聲明;當聲明需要修改時,只要有頭文件需要更新。設計頭文件還需要注意一下幾點:頭文件中所做的聲明在邏輯上應該是適於放在一起的。編譯頭文件需要一定的時間。如果頭文件他打,程序員可能不願意承受包含頭文件所帶來的編譯時帶來的帶價。

9.2頭文件用於聲明而不是用於定義。

    當設計頭文件時,記住定義和聲明的區別是很重要的。定義值可以出現一次,而聲明則可以出現多次。下面的語句是一些定義,所以不應該出現在頭文件裏:extern int ival=10;  double fica_rete;   同一個程序中有兩個以上文件含有上述一個定義將會導致多種定義的連接錯誤。

    對於頭文件不應該含有定義這一規則,有三個例外。頭文件可以定義類、值在編譯時已經知道的const對象和inline函數。這些實體可以在多個源文件中定義,只要每個源文件的定義是相同的。

9.3避免多重包含

    在編寫頭文件之前,我們需要引入一些額外的預處理器設置。預處理器允許我們自定義變量。爲了避免名字衝突,預處理器變量經常全用大寫字母表示。

    預處理器有兩種狀態:以定義和未定義。定義預處理器變量和檢測器狀態所用的預處理器指示不同。#define 指示接受一個名字並定義該名字爲預處理器變量。 #ifndef 指示檢測指定的預處理器變量是否定義。如果未定義,那麼跟在氣候的所有指示都被處理,直到出現#endif。

#ifndef SALESITEM_H
#define SALESITEM_H
    //Definition of Sales_item class related functions goes here
#endif


    












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章