天天看點

《C++必知必會》讀書筆記2

在類x的非常量成員函數中,this指針的類型為 x *const .也就是說他是指向非常量x的常量指針。

但是在類x的常量成員函數中,this的類型為const x* const . 這就是常量成員函數和非常量成員函數的差別。

類的非靜态資料成員可以被聲明為mutable,這将容許她們的值可以被這個類的常量成員函數(也包括非常量成員函數)修改。

如果一個類聲明了一個或者多個虛函數,那麼編譯器會為這個類的每一個對象插入一個指向虛函數表的指針。

如果使用了虛拟繼承,對象将會通過嵌入的指針,偏移量或者其他非嵌入的資訊來維持對其虛基類自對象位置的跟蹤。是以,即使類沒有聲明虛函數,其中還是有坑被插入了一個虛函數表的指針。

對于一個類x來說,複制構造函數應該被聲明為 x (const x &);  而複制指派操作符應該被聲明為x& operator=(const x&) 。

将一個函數的位址初始化或指派給一個指向函數的指針的時候,無需顯式的取得函數位址,編譯器知道隐式的擷取函數的位址,是以在這種情況下,&操作符是可選的。比如:

void (*fp)(int );

extern void h(int);

fp=h;  //ok

fp= &h; //ok

類似的,可以采用如下的方式調用函數:

fp(12); 或者 (*fp)(12);

注意,和void * 指針可以指向任何類型的資料不同,不存在可以指向任何類型函數的通用指針。

還要注意,非靜态成員函數的位址不是一個指針,是以不可以将一個函數指針指向一個非靜态成員函數。

函數指針的一個傳統用途是實作回調。

一個函數指針指向内聯函數是合法的。但是如果通過函數指針調用内聯函數将不會導緻内聯函數的調用,因為編譯器通常無法在編譯階段确定将會調用什麼函數。

繼續閱讀