c ++及其成员中对象的地址

时间:2012-07-23 06:57:03

标签: c++ class pointers

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

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

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

执行的输出是:

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

现在我怀疑是:

是否保证类成员变量的地址始终指向对象的地址? 我是否可以使用此地址以防我需要使用指针调用其他核心api函数?

当我用谷歌搜索时我看到了这个?

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

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

2 个答案:

答案 0 :(得分:8)

  

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

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

  

我是否可以使用此地址以防我需要使用指针调用其他核心api函数?

不,你不需要:只要你有权访问会员,你也可以访问this,不是吗?

答案 1 :(得分:1)

对于类,除非它们具有任何虚函数,否则也是如此。如果你有继承,你也应该小心(不确定规则是多么准确)。

总的来说,这是个坏主意。你为什么要那样做?你依赖于类的结构(例如,如果你偶然在年龄之前添加一个成员,你的代码就会中断)并且你放弃封装(没有其他类应该有一个指向age的指针,因为它是私有的 - 你会泄露你对象表示。)

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

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

(否则编译器将首先调用int和string的默认contstructors,然后对它们调用operator = - 这样效率不高)。