使用指向类成员的指针和结构成员之间的差异

时间:2013-10-04 12:26:29

标签: c++ class pointers structure

我是c ++的新手。我被告知结构和类几乎相同。主要区别是c ++中的类默认是私有的,而结构是公共的。

我有两个不同的代码,我们使用指针来构造成员和classe成员。

struct Simple { int a; };
int main() {
Simple so, *sp = &so;
sp->a;
so.a;
}

我们以上述方式使用指向struct成员的指针。

为什么我们必须按照以下方式使用指向类成员的指针?

class X {
public:
  int a;
  void f(int b) {
    cout << "The value of b is "<< b << endl;
  }
};

int main() {

  // declare pointer to data member
  int X::*ptiptr = &X::a;
  int X::*ptiptr1 = &X::a;

  // create an object of class type X
  X xobject,xobject1;

  // initialize data member
  xobject.*ptiptr = 10;
  xobject->*ptiptr1 = 11;

}

为什么我们首先声明指向类数据成员的指针?为什么我们不能像我们为结构所做的那样去做?

请帮帮我。谢谢。

2 个答案:

答案 0 :(得分:3)

你在这里做了两件完全不同的事情。

第一个是为一个特定对象创建一个普通的对象指针。这是指该对象,可用于访问其任何成员。

第二个创建指向成员的指针,它与对象指针非常不同。它引用类成员而不是特定对象,并且可以应用于任何对象以访问该成员。

在任何一种情况下,使用classstruct关键字定义类都无关紧要。这仅影响成员是默认为私人还是公共。

答案 1 :(得分:1)

struct S {
    int a;
};

class C {
public:
    int a;
};

与您对struct所做的完全相同:

S so, *sp = &so;
sp->a = 3;
so.a = 3;

您也可以使用class

C co, *cp = &co;
cp->a = 3;
co.a = 3;

关于指向成员的指针:这样的指针需要一个struct / class的实例才能用于访问该成员。非静态成员是特定于对象的,因此除非您有一个可以访问其成员的对象,否则指针本身是无用的:

S so;
int S::* memberPtr = &S::a;
so.*memberPtr = 3;