第2
章 變數和基本型別
1、 變數直接初始化和變數
複製初始化
int ival(1024); //direct-initialization
int ival = 1024; //copy-initialization
「初始化不是賦值」
。2、內建型別復
制初始化和直接初始化幾乎沒有區別;但
對類型別物件來
說,有些初始化只能用直接初始化完成。
3、未初始化變數
時,系統有
時會自動初始化。內建類
型變數在函式外定
義時被系
統初始化為0
,在函式體內則不
進行初始化,建
議每個內建型別
物件都要初始化(
這是個好的
習慣)。;
類型別用建構函式
進行初始化,大部分
類型別具有默
認建構函式,可以為物件
進行隱式初始化,有些
類型別沒有默
認建構函式,每個定
義必須顯式提供初始化式,否
則根本不能定
義該型別變數。
4、 變數的宣告和定義
一次定義
多次宣告。
定義,
為變數分配記憶體儲存空
間,還可以
賦初值。在乙個程式中
變數有且
僅有一次定義。
宣告,定
義也是宣告,
還可以只宣告不定
義,即用使用
關鍵字:
extern
。extern
宣告不是定
義,沒有分配記憶體空間,事
實上,他只說明
變數定義在程式的其他地方。
如果宣告有初始化式,那
麼它可被當成定
義,即使宣告
標記為extern:
extern int ival = 3; //definition
注意:只有
extern
宣告在函式外
時才能含有初始化式。
通常把乙個
物件的定
義在首次使用之前是乙個很好的方法(個人
認為,在大型程式中這樣定
義會使程式看起來凌亂)。6、
const
限定符因
為常量定
義後就不能修改,所以定義時必
須初始化。
const std::string hi = "hello world"; //ok initialized
const int i, j = 5; //error :i is uninitialized const
const物件默
認為檔案的區域性變數。
//file_1.cc
int counter; //define
//file_2.cc
extern int counter; //use counter form file_1.cc
counter++;
//file_1.cc
extern const int bufsize = 512; //define
//file_2.cc
extern const int bufsize ; //use bufsize form file_1.cc
bufsize ++;
非const變數默
認為extern.
要使const
變數能在其他檔案中
訪問,必
須顯示指定它
為extern.
5、引用(
reference
)實際應
用中引用主要用做函式的形式引數。
不能定義引用型別的引用,但能定義其他任何型別的引用。當引用初始化後,只要該引用存在,它就保持繫結到初始化時指向的物件。不可能將引用繫結到另乙個物件上。引用僅僅是物件的另乙個名字。
引用必須用和該引用同型別的物件進行初始化。例如下:
int ival = 1024;
int &refval = ival; //ok:refval refer to ival
int &refval2; //error:a reference must be initialized
int &refval3 = 10;//error:initializer must be an object
const
引用時指向
const
物件的引用
const int ival = 1024;
const int &refval = ival;//ok:both reference and object are const
int ref2 = ival;//error:nonconst reference refer to a const object
非const
引用只能繫結到與該引用相同型別的物件
const
引用則可以繫結到不同但相關型別的物件或右值(如:
42)。
int ival =42;;
const int &r = 42;//legal
但是非const
引用就不合法。
const int &r2 = r + ival;//legal
之所以const
引用可以繫結到不同但相關型別的物件上,是因為存在型別的隱式轉換,如:
double dval = 3.14;
const int &ri = dval;
編譯器會把**改編成如下形式:
int temp = dval;
const int &ri =temp;//ri
其實繫結的是臨時變數。 7
、類型別 除了
class
關鍵字外還可以用
struct
關鍵字定義類。兩者的唯一區別在於預設訪問級別不同:
struct
成員為public,
而class
的成員為
private
,即定義在第乙個訪問標號(
private
或public
)前的成員都隱式的定義為預設級別。 8
、編寫自己的標頭檔案
因為標頭檔案包含在多個原始檔中,所以不能含有函式和變數定義。但有三個例外,標頭檔案可以定義類,值在編譯時就已經知道得
const
物件和inline
函式。這些實體可在多個原始檔中定義,只要每個原始檔中的定義是相同的。
在標頭檔案中定義是因為編譯器需要知道他們的定義來產生**。如果
const
變數不是用常量表示式初始化,那麼它就不應該在標頭檔案中定義。當我們在標頭檔案中定義
const
變數後,每個包含標頭檔案的原始檔都有了自己的
const
變數,其名稱和值都一樣。當
const
變數是用常量表示式進行初始化時,可以保證所有的變數都有相同的值。但是在實踐中,大部分編譯器在編譯時都用常量表示式來替換
const
變數的使用。所以在實踐中不會有任何儲存空間用於儲存用常量表示式進行初始化的
const
變數。
使用與處理器變數避免多重包含。
#ifndefsalesitem_h
#definesalesitem_h
//#endif
C Primer讀書筆記
前些日子開始看 c primer 順便做一些筆記,既有書上的,也有自己理解的。因為剛學c 不久,筆下難免有謬誤之處,行文更是凌亂 所幸不是用來顯配的東西,發在linuxsir只是為了方便自己閱讀記憶,以防只顧上網忘了正事。書看了不到一半,所以大約才寫了一半,慢慢補充。const要注意的問題 1 下面...
C Primer讀書筆記
前些日子開始看 c primer 順便做一些筆記,既有書上的,也有自己理解的。因為剛學c 不久,筆下難免有謬誤之處,行文更是凌亂 所幸不是用來顯配的東西,發在linuxsir只是為了方便自己閱讀記憶,以防只顧上網忘了正事。書看了不到一半,所以大約才寫了一半,慢慢補充。const要注意的問題 1 下面...
C Primer 讀書筆記
c primer 中文版 程式由兩部分構成,資料 演算法。兩者之間的關係稱為程式設計方法。過程化程式設計方法,乙個問題由一系列的演算法建立模型 三種著名的過程語言fortran c和pascal 單獨的過程,被成為函式。後來又發展出抽象資料模型的程式設計方法,現在成為基於物件的程式設計方法,通過一組...