當物件在建立時獲得了乙個特定的值, 我們就說這個物件被初始化了.在使用=號時, 如果建立了新的物件, 則為初始化而非賦值.
初始化不是賦值, 初始化的含義是建立變數時賦予其乙個初始值, 而賦值的含義是吧物件的當前值擦除, 而以乙個新值代替.
在使用列表初始化(c++11支援)時, 如果存在丟失資訊的風險, 則編譯器會報錯.
預設初始化: 如果變數定義時沒有指定初值, 則被預設初始化. 預設值由變數型別和變數定義的位置決定. **定義在任何函式之外的內建型別變數被初始化為0, 定義在函式體內部的內建型別變數將不被初始化. **
定義在函式內的內建型別的物件如果沒有初始化, 其值是未定義的.類物件如果沒有顯示初始化, 其值由類決定.
分離式編譯允許將程式分割為若干個檔案, 每個檔案可被獨立編譯. 為了支援分離式編譯, c++語言將宣告和定義區分開來, 宣告使得名字為程式所知, 如果乙個檔案想要使用別處定義的名字則必須包含對那個名字的宣告, 而定義負責建立與名字關聯的實體.
如果想宣告乙個變數而非定義它, 就在變數名前新增關鍵字extern且不要顯示地初始化變數:
extern int i; //宣告i而非定義i
int i; //宣告並定義i
任何包含顯式初始化的宣告即成為定義. extern語句如果包含了初始值就不再是宣告, 而變成定義了:
extern int i = 10; //定義
在函式體內部, 如果試圖初始化乙個由extern關鍵字標記的變數, 將引發錯誤. 變數能且只能被定義一次, 但是卻可以多次宣告.
變數能且只能被定義一次, 但是可以被宣告多次.
要在多個檔案中使用同乙個變數, 就必須將宣告和定義分離, 變數的定義必須出現在且只能出現在乙個檔案中, 其他用到該變數的檔案必須對其進行宣告, 卻絕對不能重複定義.
引用就是乙個物件的別名, 引用必須初始化, 一旦初始化完成, 引用將和它的初始值物件一直繫結在一起, 無法令引用重新繫結到另外乙個新的物件上.
引用並非物件, 他只是為乙個已經存在的物件所起的另外乙個名字而已.
引用本身不是物件, 因此無法定義引用的引用.
兩種方法為指標置空
int *p = nullptr; // c++11標準推薦, 字面值型別
int *q = null // 需要#include , 預處理器變數
int *r = 0; // ok, 初始化字面值常量0
現代c++程式最好使用nullptr, 避免使用null.
初始化和const: 如果利用乙個物件去初始化另乙個物件, 則它們是不是const都無關緊要:
int i = 42;
const int ci = i;
int j = ci;
const常量特徵只在構造完成時才生效, 因此初始化時可以給它乙個初始值.
預設狀態下, const物件僅在檔案內有效, 如果想要在乙個檔案中定義它, 而在多個檔案中宣告並使用它, 解決的辦法是對於const變數不管是宣告還是定義都新增extern關鍵字.
extern const int bufsize = fcn(); // file1.cc定義並初始化乙個常量, 該常量能被其他檔案訪問
extern const int bufsize;// file1.h中, 與file1.cc中是同乙個bufsize
如果想在多個檔案之間共享const物件, 必須在比變數的定義之前新增extern關鍵字.
可以把引用繫結到const物件上, 稱之為對常量的引用, 對常量的引用不能被用作修改它所繫結的物件.
const int ci = 1024;
const int &r = ci; // 引用以及對應的物件都是常量
int i = 42;
const int &r2 = i; // 允許將const int &繫結到普通int物件上, 但是不允許通過r2改變i的值
如果const關鍵字出現在星號左側, 表示被指物是常量, 如果出現在星號右側, 表示指標自身是常量.
頂層const表示指標本身是個常量, 底層const表示指標所指的物件是乙個常量.
常量表示式(const expression)指值不會改變並且在編譯過程中就能得到計算結果的表示式
typedef int elementtype;
using elementtype = int; // c++11標準, 與typedef等價的定義
型別別名的錯誤理解
const char *pstring;
const pstring cstr = 0; // cstr是指向char的常量指標, 即cstr本身是const的不可改變, 但所指物件可以改變
const char *cstr2; // cstr2是指向const char的指標, 即cstr2本身可以改變, 所指物件不可改變.
auto讓編譯器通過初始值來推算變數的型別, 顯然auto定義的變數必須有初始值.
使用引用型別推斷結果是引用所繫結的物件的型別, 如果希望推斷出引用型別必須明確指出.
int i = 0, &r = i;
auto a = r; // a的型別為int 而非int &
auto &b = r; // b的型別為int &
auto一般會忽略掉頂層const, 同時底層const則會被保留下來
const int ci = i, &cr = ci;
auto b = cr; // b是int型別 而非const int
const auto c = ci; // ci推斷出是int, c是const int型別
如果decltype使用的表示式是乙個變數, 則decltype返回該變數的型別,包括頂層const和引用在內.
const int ci = 0, &cj = ci;
decltype(ci) x = 0; // x型別為const int
decltype(cj) y = x; // y型別為const int &, 因此必須初始化
// 以下是decltype幾個特殊用法
decltype(f()) sum = x; // x型別為f()返回值型別, f()並沒有被呼叫
int i = 42, *p = &i, &r = i;
decltype(r + 0) b; // 加法結果是int, 因此b是未初始化的int
decltype(*p) c; // 若表示式內容是解引用操作, 則得到引用型別, 因此c是int &, 必須初始化
decltype((i)) d; // 雙層括號的結果永遠是引用型別, 而單層括號只有當表示式是引用型別其結果才是引用型別
C Primer第2章 變數和基本型別
c 定義了一套包括算術型別和空型別在內的基本資料型別。算術型別分為兩類 整型和浮點型。算術型別的尺寸在不同機器上有所差別。型別含義 最小尺寸常見 bool 布林型別 未定義 char 字元8位 wchar t 寬字元16位 char16 t unicode字元 16位 char32 t unicod...
C Primer第2章 變數和基本型別
c 定義了一套包括算術型別和空型別在內的基本資料型別。算術型別分為兩類 整型和浮點型。算術型別的尺寸在不同機器上有所差別。型別含義 最小尺寸常見 bool 布林型別 未定義 char 字元8位 wchar t 寬字元16位 char16 t unicode字元 16位 char32 t unicod...
C Primer筆記 第2章 變數和基本型別
1.算術型別的儲存空間依機器而定,c 標準規定了每個算術型別的最小儲存空間,但它並不阻止編譯器使用更大的儲存空間。2.一般地,short型別為半個機器字長,int型別為乙個機器字長,而long型別為乙個或兩個機器字長 32位機器中int型別和long型別通常字長是相同的 3.c 中,把負值賦給uns...