1. 程式人生 > >**C++變數和基本內建型別**(C++ Primer讀書筆記)

**C++變數和基本內建型別**(C++ Primer讀書筆記)

1.內建型別包括算數型別和空型別(void,適用於沒有任何返回值的函式或者其他的特殊場合)。算數型別包括整形(字元和布林型)和浮點型。

2.除了布林型和擴充套件的字元型之外。,其餘的整形都可以通過在前面新增unsigned來變成無符號型別(帶符號的型別可以表示負數,0,和整數。無符號型別只可以表示大於等於0的數)
3.字元型被分為三種(char,signed char和unsigned char)。但是字元型只有帶符號和無符號的。
char可以表現為上訴其中一種,具體的由編輯器決定。
4.關於選擇型別:
(1)當明知是不可負時,選擇無符號
(2)超出int用long long
(3)算數表示式中不要用char和bool。(因為char有符號無符號不確定)。(只有在存放字元和布林型的時候用他們)
(4)執行浮點型的時候用double。
5.單引號裡面的是字元,雙引號括起來的就是字串。字串實際上就是字元構成的陣列。編譯器在每個字串的末尾新增一個‘\0’。因此字串的字面值長度應該比它的內容多1.
6.資料型別決定著變數所佔記憶體的大小和佈局方式,該空間能儲存值的範圍。以及變數能參與的運算。對於C++來說。“變數”和“物件”和可以互換使用。
7.關於變數
(1)string是一種表示可變字元序列的資料型別。如果沒有初始化,那麼生成一個空串。
(2)初始化的表示方法:
int a=0;
int a={0};
int a{0};
int a(0);都行
花括號(列表初始化)是C++11的新標準。當用於內建型別的初始化的時候,如果我們使用列表初始化存在丟失資訊的分險,那麼將會報錯。例如:
double ld=3.1415926;
int a{ld};錯誤,因為轉換未執行
int a(ld);正確。
(3)如果內建型別沒有初始化。那麼要是定義在函式體外,那麼預設值為0。如果定義在函式體內,那麼不將被初始化。一個未被初始化的內建型別變數的值是未定義的,所以對此進行拷貝以及利用其它方式對此進行訪問是錯誤的。
(4)變數的宣告和定義
宣告使得名字為程式所知,一個檔案如果想用到別處定義的名字就必須包含對那個名字的宣告。而定義則是建立與名字關聯的實體。
宣告而非定義:extern int i;(不要初始化)
宣告並定義:int i;
一個變數只可以定義一次,但可以被宣告多次。
8.引用
引用只是給已經存在的物件起一個別名(所以引用必須初始化為已經存在的物件)
int a=3;
int &b=a;(b指向a,是a的另一個名字)對b進行的所有操作都是在與之繫結的物件(a)上進行的。
給b賦值,其實是給a賦值,把b賦給別的物件,其實是把a賦給別的物件。
因為引用本身不是一個物件,所以不可以定義引用的引用。
9.指標
(1)指標與引用的不同。
指標本身是一個物件,所以可以對指標進行賦值和拷貝,而且在指標的生命週期裡可以先後指向幾個不同的物件。
指標在定義的時候無需一定要賦初值。(和其他內建型別一樣,在塊作用域內定義的指標如果沒有初始化,也將擁有一個不確定的值)。
因為引用不是具體的物件,所以不可以定義指向引用的指標。
(2)&和*
當&和*出現在宣告語句中(左側)代表是引用

指標型別。
用於表示式中(右側)&代表的是取地址符;*代表的是解引用符(也就是的到指標所指的變數)
int *p=&a;
int &r=*p;
的意思是給(*p)也就是變數a起了個新名字叫r。
(3)定義空指標
int * p=nullptr;(C++11)
int *p=0;
int *p=NULL(需要加上#include cstdlib標頭檔案)
(4)void *指標
void *指標可以指向任何型別的值,但是不同的是我們對於其指向的物件型別並不瞭解,所以不能直接操作void *指標所指的物件。以void *視角來看記憶體空間也就僅僅是記憶體空間,沒辦法訪問記憶體空間裡的物件。
(5)指向指標的指標

int a=10;
int *p=&a;
int **q=&p;
//輸出a的值有以下三種方法:
cout<<a;
cout<<*p;
cout<<**q;(其中*q代表的是變數p,**q代表變數a)

(6)指向指標的引用(因為指標是具體的物件,所以可以對指標進項引用)

int i=42;
int *p;
int *&r=p;    //給指標變數p起了個別名為r;所以現在r既是指標p;對r操作就是對p操作
r=&i;          //因為現在r就是指標了,所以r指向i,就是p指向i;
*r=10;       //i=10

分析r到底是什麼型別。可以從右到左來閱讀。離變數最近的符號對變數有最直接的影響(&r),所以r是一個引用。宣告符的其餘部分用以確定r引用的型別是什麼?*表明r引用的是一個指標。所以r引用的是一個int型指標。
10、const(const物件必須初始化)
(1)const int bufSize=512;
定義變數bufSize成為一個常量。任何給bufSize賦值以及試圖改變bufSize變數大小的操作都是不允許的。
(2)預設的const物件只有在本檔案中才有效。要是想使在多個檔案之間共享const物件,必須新增entern關鍵詞。例如:extern const int bufSize;
(3)初始化與const
如果利用一個物件去初始化另外一個物件,則他們是不是const都無關緊要

int i=42;
const int ci=i;  //用一個非const變數去初始化const變數
int j=ci;        //const變數去初始化const變數