Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对象在c+中的地址+;及其成员_C++_Class_Pointers - Fatal编程技术网

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

C++ 对象在c+中的地址+;及其成员,c++,class,pointers,C++,Class,Pointers,我正在处理我的一个申请问题。 这里我面临的问题是,我需要使用类对象的指针调用一些函数 但是主要的问题是我没有带类指针,而是带了一个成员变量值(比如说它是一个值列表)。接下来,我用下面的代码做了一个小测试 using namespace std; class Person { public: Person(string name, int age) { this->name = name; this->age = age;

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

但是主要的问题是我没有带类指针,而是带了一个成员变量值(比如说它是一个值列表)。接下来,我用下面的代码做了一个小测试

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;
}
现在我的疑问是:

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

我在谷歌上看到的

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

这是真的,即使在C++和类?

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

< C++中,在第一个成员(特别是派生类和多态类)之前有潜在的东西。实现定义了什么

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


不,您不需要这样做:无论何时您有权访问成员,您也有权访问
,否?

除非类具有任何虚拟函数,否则这同样适用于类。此外,如果您有继承权,您应该小心(不确定规则到底有多少)

但总的来说,这是个坏主意。你为什么要这么做?您依赖于类的结构(即,如果您意外地在age之前添加了一个成员,那么您的代码将被破坏),并且您放弃了封装(其他任何类都不应该有指向age的指针,因为它是私有的-您将泄漏您的对象表示)

顺便问一下:你是Java程序员吗?由于没有正确初始化对象,您的构造函数看起来就是这样。你应该这样做:

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

(否则编译器将首先调用int和string的默认contstructor,然后对它们调用operator=,这是无效的)。

请参阅offsetof宏。仅适用于吊舱类型!对于每个类类型,每个数据成员都将处于固定的偏移值。这不是对象的起始地址,因为编译器将一些内容放在顶部。但当您拥有虚拟函数时,情况就不同了,因为编译器也需要将vptr*放入对象中。因此,我通常不认为这样做是好的做法。可能是相关的:不幸的是,没有。我有一个指向树的最后一片叶子的指针,我只有父键,使用父键,我可以得到它的子元素列表,它是一个列表,它是类的一个成员。这可以说是一个树,但它不是一个实际的树彼得:这还不清楚。但答案是一样的。不能将指向成员的指针用作指向类的指针。这样做会导致无效的C++代码会被破坏。
Person(String n, int a) : age(a), name(s) {}