這篇講一下《深度探索C++物件模型》第三章最后沒總結的一部分,就是類的成員變數指標,
這里所謂類的成員變數指標就是指系結某個類的某個成員變數的指標,而不是某個物件的某個成員變數的指標,下面展現了兩者的不同:
// test14.cpp
#include <cstdio>
struct Test {
char c;
short s;
int i;
};
int main() {
Test t = {.c = 1, .s = 2, .i = 3};
int* pi = &t.i; // 這個指向物件的成員變數的指標,型別為int*
int Test::* pmi = &Test::i; // 這是指向類的成員變數的指標,型別為int Test::*
// 類的成員變數指標的使用:
t.*pmi = 4; // 通過物件使用
printf("t.i = %d\n", t.i);
Test* pt = &t;
pt->*pmi = 5; // 通過指標呼叫
printf("t.i = %d\n", t.i);
}
類的成員變數的指標表征的是該成員變數在類內的偏移量,
那如何判斷一個指向類的成員變數的指標是無效還是有效?通常指標值為0是無效地址,但偏移為0是有效的呀,
在《深度探索C++物件模型》一書中談到,為了實作上面的功能,向類的成員變數的指標通常會在其偏移量上加1,在使用時再把1減去,即有效的指向類的成員變數的指標是大于0的,這樣0值就是無效的了,
那g++是怎么樣實作的呢?
// test15.cpp
#include <cstdio>
struct Test {
char c;
short s;
int i;
};
int main() {
Test t = {.c = 1, .s = 2, .i = 3};
int Test::* pi_valid = &Test::i;
int Test::* pi_invalid = nullptr;
}
使用gdb除錯如下:

可見,g++的實作就是直接把無效的指標設定為-1,而不修改偏移量,
好了,除了存取效率之外,到此為止第三章內容基本就說完了,至于效率我就不測驗了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/521813.html
標籤:其他
上一篇:C 語言實作一個簡單通訊錄
