C++中復雜聲明和定義的辨析
0x00 前言
c++中的復雜聲明往往令人無法下手,經常使人搞錯這到底聲明的是一個指針還是指針函數。但其實c++對於復雜聲明是遵循一定的規則的,叫做變量名—>右--左-右規則。
0x01 規則解釋
對於復雜定義最好的處理方式是從中間開始向外擴展。“從中間開始的”的意思是從變量名開始。“向外擴展”的意思是先註意到右邊最近的項,遇到括號則往左邊讀,然後在前往下一層的右邊,遇到括號則向左邊讀,以此右左右直到全部讀完為止。類似於剝洋蔥,從裏到外層層剝離
0x02 實際應用
簡單例一:Void (*funptr)();//指針
讀法:funptr是一個指針(PS:由於funptr開始向右讀就碰到了括號,所以返回左邊,讀到了指針符號
簡單例二:Void* funptr();//返回指針的函數
讀法:funptr是一個無參函數(PS:funptr右邊有括號,故先讀出來,右邊帶括號的意思就是函數),該函數返回空型指針。
簡單例子三:int (*p)(char);//指針
讀法:p是一個指針,這個指針指向一個無參的返回值位int類型的函數。
0x02 更為復雜的情況
復雜定義常常帶有const,[]等關鍵字或者符號。特別是const更容易引起我們的誤讀。
例子一:char **p;
讀法:p是一個指針,該指針指向一個指針,這個被指向的指針是char類型的。
這樣讀看起來很拗口,但是可以幫你層層剝離定義之間的關系。當然也可以這樣讀:p是一個指向char類型的指針的指針,雖然這樣讀通順了很多,但是不熟悉的還是不建議。
例子二:const char **p2;
讀法:p2是一個指針,這個指針指向另一個指針,被指向的指針是const char型(PS:const char 這種順序放一起連讀即可,不然這個太拗口了)
也可讀作:p2是一個指向const char類型的指針的指針。
例子三:char * const * p3;
讀法:p3是一個指針,這個指針是const指針(理解為常量指針,值不變),被指向的const指針為char類型。也可讀作:p3是指向char型指針的const指針。
上訴幾個例子還不算難,下面來看幾個難度很大的。
難例一:
char ** (*p)(float, float);
讀法:p是一個指針,它指向了帶有兩個float參數的函數的指針,被P指向的指針是指向函數返回值char型指針的。簡單說來就是p是指向了一個返回值為char型指針的指針。
C++中復雜聲明和定義的辨析