對c/c++指針的一個總結
int * p = new int(10);
int *p = new int [10];
(*p)()是标準寫法,p()是簡單寫法
非常的套路
靜态成員函數
這個等效于限定作用域的普通函數
查了一下,&可加可不加,正常來說不需要加&
ll (*p)(ll) = test::f;
因為c++定義,函數名就是函數的起始位址
普通成員函數
成員函數指針的size是普通指針的兩倍
也就是實作為8位元組的具體函數指針 + 8位元組的偏移量
8位元組的具體函數指針指向一個帶有this指針參數的函數
8位元組的偏移量,标志這個對象,的偏移量
因為多繼承的時候,會有一個對象布局的情況
沒有多繼承的時候,這個偏移量是 0
這裡有比較奇怪的 .* 和 ->*,專門調用成員函數的運算符
還有優先級的問題,要(obj ->* p)()這樣調用
靜态成員函數、成員模闆函數類似
取靜态類成員函數指針的時候,要全局初始化全局變量
否則連結失敗
注意普通指針實作為一個位址,而成員變量指針實作為一個偏移量
空成員變量指針的值為-1
這也是為什麼成員變量指針需要特殊的操作的原因
多繼承,虛基類,虛函數,的各種指針
多繼承,虛基類的時候,指針會複雜起來
普通指針就是一個位址,不同的指針類型意味着對記憶體不同的操作方式,以及做算數運算時不同
為了實作指針的語意,不同的編譯器有不同的實作方式
複雜指針的實作具體看編譯器
c++11中沒有make_unique,可以自己寫一個,寫的時候注意數組
author : xdu18清歡