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) {}