[英]How Does Getting the Address of a Class Member Through a Scope Resolution Operator Work When Using a Pointer-to-Member?
使用指向成員的指針(AKA點星或箭頭星)訪問類成員時,我們可以使用以下語法:
A * pa;
int A::*ptm2 = &A::n;
std::cout << "pa->*ptm: " << pa->*ptm << '\n';
我的問題是&A::n
語句是如何工作的?
在上面的例子中, n
是一個變量。 如果不是成員變量, n
是一個函數(我們定義了指向成員函數的指針而不是指向成員的指針),我可能會因為一個類的函數可以有效地靜態(看到Nemo的評論),我們可以通過&A::some_function
找到一個類的函數地址。 但是,如何通過類范圍解析獲取非靜態類成員的地址? 當我打印&A::n
的值時,這更令人困惑,因為輸出僅為1
。
聲明指向成員數據的指針時,它不受任何特定實例的限制。 如果您想知道給定實例的數據成員的地址,則需要在執行.*
或->*
之后獲取結果的地址。 例如:
#include <stdio.h>
struct A
{
int n;
};
int main()
{
A a = {42};
A aa = {55};
int A::*ptm = &A::n;
printf("a.*ptm: %p\n", (void *)&(a.*ptm));
printf("aa.*ptm: %p\n", (void *)&(aa.*ptm));
}
打印為一個可能的輸出:
a.*ptm: 0xbfbe268c
aa.*ptm: 0xbfbe2688
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.