5

我正在处理我的一个应用程序问题。这里我面临的问题是我需要使用类对象的指针调用一些函数。

但主要问题是我没有类指针,而是我有一个成员变量值(可以说它是一个值列表)。在此之后,我用下面的代码做了一个小测试。

using namespace std;

class Person {
public:
      Person(string name, int age) {
            this->name = name;
            this->age = age;
      }
      string getName() {
            return name;
      }
      int getAge() {
            return age;
      }
      void Print()
      {
      printf("This address is %x\n",this);
      printf("age adress is %x\n",&age);

      }
private:
      int age;
      string name;

};

int main() {
      cout << "Creating a person..." << endl;

Person *johnDoe=new Person("John Doe", 25);
      cout << "Person's name: " << johnDoe->getName() << endl;
      cout << "Person's age: " << johnDoe->getAge() << endl;
      johnDoe->Print();
      delete johnDoe;
      return 0;
}

执行的 coutput 是:

> ./a.out
Creating a person...
Person's name: John Doe
Person's age: 25
This address is 72918
age adress is 72918

现在我的疑问是:

是否保证类成员变量的地址总是指向对象的地址?如果我需要使用指针来调用其他核心 api 函数,我可以使用这个地址吗?

我google的时候看到了这个?

(C1x §6.7.2.1.13:“一个指向结构对象的指针,经过适当转换,指向它的初始成员……反之亦然。作为结构对象,可能有未命名的填充,但不是在它的开头。”)

即使在 c++ 和类的情况下也是如此吗?

4

2 回答 2

8

是否保证类成员变量的地址总是指向对象的地址?

不。在 C++ 中,在第一个成员之前可能有一些东西(特别是对于派生类和多态类)。究竟有什么是实现定义的。

如果我需要使用指针来调用其他核心 api 函数,我可以使用这个地址吗?

不,而且您不需要:只要您可以访问成员,您也可以访问this,不是吗?

于 2012-07-23T06:59:57.170 回答
1

这也适用于类,除非它们具有任何虚函数。如果你有继承权,你也应该小心(不确定规则到底有多精确)。

总的来说,这是一个坏主意。你为什么要这样做?您依赖于类的结构(即,如果您在年龄之前不小心添加了一个成员,您的代码将会中断)并且您放弃封装(无论如何其他类都不应该有指向年龄的指针,因为它是私有的 - 你会泄露你对象表示)。

顺便说一句:你是 Java 程序员吗?你的构造函数看起来像你,因为你没有正确初始化你的对象。你应该这样做:

Person(String n, int a) : age(a), name(s) {}

(否则编译器将首先调用 int 和 string 的默认构造函数,然后在它们上调用 operator= - 这效率不高)。

于 2012-07-23T07:05:50.770 回答