我請求你幫助我理解這個概念。也許我不明白,我不知道.. 所以我有這個示例代碼:
#include <iostream>
class X{
int a;
public:
void do_lengthy_work();
};
void X::do_lengthy_work(){
std::cout << a << std::endl;
}
int main(){
X my_x;
printf("%p\n", &X::do_lengthy_work); // -> does compile
printf("%p\n", &my_x.do_lengthy_work); // -> doesn't compile,
// error: ISO C forbids taking the address of a bound member function to
// form a pointer to member function. Say &X::do_lengthy_work
}
我在一本書中看到了這個代碼示例。我認為我們無法獲取類方法的地址,除非指定了一個我們想要從中獲取該函式地址的物件。但事實證明,我們只能獲取類的方法地址,而不能獲取物件的方法地址。我認為每次我們宣告一個類的物件時,它都會獲得自己的方法,并具有單獨的地址。另外,如果我們做這樣的事情:
#include <iostream>
class X{
int a;
public:
void do_lengthy_work();
int b;
};
void X::do_lengthy_work(){
std::cout << a << std::endl;
}
int main(){
X my_x;
printf("%p\n", &X::do_lengthy_work);
printf("%p\n",&X::b);
printf("%p",&my_x.b);
}
示例輸出是:
0x562446a9c17a
0x4
0x7ffe7491a4cc
類方法和物件的變數地址都發生了變化。但是b的變數地址沒有變化。它總是 0x4,距離 0x00 4 個位元組,因為它是一個 int 變數。但是為什么它的地址離0x00這么近,而函式的地址卻這么遠呢?另外 - 重復我之前代碼示例中的問題 - 為什么我們不能得到系結成員函式的地址,但我們可以得到一個類的方法?
例如,我們可以這樣做:
&X::method
但不是這個:
&object.method
我開始想——如果我是對的,你能糾正我嗎?- 類中的變數在宣告類時初始化一次(因此我們0x4在列印出 X::b 的地址時看到一個地址),然后(唯一地)每隔一次我們指定新物件(因此我們0x7ffe7491a4cc在列印出時看到my_x.b) 的地址,但是方法只初始化一次,并且每個物件都使用相同的方法,該方法總是在相同的地址上?
uj5u.com熱心網友回復:
你基本上可以認為是X這樣實作的:
struct X{
int a;
int b;
};
void X__do_lengthy_work(X* this);
方法與普通函式幾乎相同,只是添加了指向類實體的指標的隱藏引數。
類的每個實體都使用相同的方法。
將指標指向特定實體的方法可能會產生誤導,因為這可能意味著您可以在不必提供實體的情況下呼叫該方法,我猜這就是語言不允許您這樣做的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/486432.html
上一篇:掃描未簽名直到EOF無法正常作業
下一篇:記憶體分配函式回傳的點
