天天看點

c/c++ 指針

對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清歡

繼續閱讀