3

メンバーへのポインター (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

4

1 に答える 1

2

メンバー データへのポインターを宣言すると、特定のインスタンスにバインドされません。特定のインスタンスのデータ メンバーのアドレスを知りたい場合は、.*orを実行した後に結果のアドレスを取得する必要があります->*。例えば:

#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));
}

可能な出力の 1 つとして出力します。

a.*ptm: 0xbfbe268c
aa.*ptm: 0xbfbe2688
于 2013-07-19T22:09:36.300 に答える