簡體   English   中英

如何通過范圍解析操作員獲取類成員的地址時使用指針到成員?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM