2.3 複合類型 2.3.1 引用 引用就是為對象起了個別名,引用類型引用另外一種類型。通過將聲明符寫成&d的形式來定義引用類型,其中d是聲明的變數名。 int ival =1024; int &refVal= ival; // refVal 指向ival (是ival 的另一個名字) 2.3.2 ...
2.3 複合類型
2.3.1 引用
引用就是為對象起了個別名,引用類型引用另外一種類型。通過將聲明符寫成&d的形式來定義引用類型,其中d是聲明的變數名。
int ival =1024;
int &refVal= ival; // refVal 指向ival (是ival 的另一個名字)
2.3.2 指針
指針是“指向”另外一種類型的複合類型。與引用不同,第一,指針本身就是一個對象,允許對指針賦值和拷貝,而且在指針生命周期內它可以先後指向幾個不同的對象。其二,指針無須在定義時賦值。在塊作用域內定義的指針如果沒有被初始化,也將擁有一個不確定的值。
定義指針類型的方法將聲明符寫成*d的形式,其中d是變數名。
獲取對象的地址
指針存放某個對象的地址,想要獲取該地址,需要使用取地址符&。
int ival= 42;
int *p = &ival; // p存放變數ival的地址,或者說p是指向變數ival 的指針
指針值
指針的值應屬於下列4種狀態之一:
1.指向一個對象。
2.指向緊鄰對象所占空間的下一個位置。
3.空指針,意味著指針沒有指向任何對象。
4.無效指針,也就是上述情況之外的其他值。
利指針訪問對象
如果指針指向了一個對象,則允許使用解引用符(*)來訪問該對象;
int ival = 42;
int *p= &ival; //p存放變數ival的地址
std::cout<<*p; //由符號*得到指針p所指的對象,輸出42.
對指針的解引用會得出所指對象,因此如果給解引用的結果賦值,實際上也就是給指針所指的對象賦值;
*p=0;
cout<<*p; //輸出0
空指針
空指針不指向任何對象,以下列出生成空指針的方法;
int *p = nullptr;
int *p = 0;
int *p = NULL; //需要首先#include <cstdlib>
void* 指針
void* 是一種特殊的指針類型,可用於存放任意對象的地址。
double obj = 3.14 , *pd= &obj;
void *pv=&obj;
pv=pd;
利用void* 指針能做的事比較有限:拿他和別的指針比較、作為函數的輸入或輸出,或者賦給另一個void*指針。
指向指針的指針
**表示指向指針的指針,***表示指向指針的指針的指針。
int ival=1024;
int *pi=&ival;
int **ppi=π
2.4 const 限定符
const 可以讓變數的值,保持不變。
const int bufsize = 512;
某些時候有這樣一種const變數,它的初始值不是一個常量表達式,但又確實有必要在文件之間共用。這種情況下,我們不希望編譯器為每個文件分別生成獨立的變數。相反,我們想讓這類const 對象像其他對象一樣工作,也就是說,只在一個文件中定義const,而在其他多個文件中聲明並使用它。
解決辦法是,對於const 變數不管是聲明還是定義都添加extern 關鍵字,這樣只需定義一次就可以了:
// file_1.cc 定義並初始化了一個常量,該常量能被其文件訪問
extern const int bufsize = fcn();
//file_1.h 頭文件
extern const int bufsize;
file_1.cc 定義並初始化bufsize。因為這條語句包含了初始值,所以它是一次定義。然而,因為bufsize 是一個常量,必須用extern 加以限定使其被其他文件使用。
file_1.h 頭文件中的聲明也由extern做了限定,其作用是指明bufsize 並非本文件獨有,它的定義將在別處出現。
用頂層const 表示指針本身是一個常量,而用名詞底層 const 表示指針所指的對象是一個常量。
int i = 0;
int *const p1 = &i; // 不能改變p1的值,這是一個頂層的const
const int ci = 42; //不能改變ci的值,這是一個頂層const
const int *p2 = &ci; //允許改變p2的值,這是一個底層const
const int *const p3 = p2; // 靠右的const 是頂層const,靠左的是底層const
const int &r = ci; //用於聲明引用的const 都是底層const
constexpr 變數
允許將變數聲明為constexpr類型以便由編譯器來驗證變數的值是否是一個常量表達式。
constexpr int mf = 20;
constexpr int limit = mf +1;
constexpr int sz = size();
2.5 處理類型
2.5.1 類型別名
typedef double wages; //wages 是double 的同義詞
typedef wages base,*p; //base是double的同義詞,p是double *的同義詞
新的聲明方法
using SI = Sale_item; //SI是Sale_item 的同義詞
2.5.2 auto 類型說明符
auto 讓編譯器通過初始值來推算變數的類型。
2.5.3 decltype 類型指示符
有時會遇到這種情況:希望從表達式的類型推斷出要定義的變數的類型,但是不想用該表達式的值初始化變數。decltype 的作用是選擇並返回操作數的數據類型。
decltype(f()) sum = x; // sum的類型就是函數f的返回類型