我正在处理我的一个应用问题。 这里面临的问题是我需要使用类对象的指针调用一些函数。
但主要的问题是我没有一个类指针与我,而是我有一个成员变量值(让我们说它的值列表)。在此之后,我使用以下代码进行了一项小测试。
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 ++和类的情况下也是如此?
答案 0 :(得分:8)
是否保证类成员变量的地址始终指向对象的地址?
没有。在C ++中,在第一个成员之前有可能存在的东西(特别是对于派生类和多态类)。究竟有什么实现定义。
我是否可以使用此地址以防我需要使用指针调用其他核心api函数?
不,你不需要:只要你有权访问会员,你也可以访问this
,不是吗?
答案 1 :(得分:1)
对于类,除非它们具有任何虚函数,否则也是如此。如果你有继承,你也应该小心(不确定规则是多么准确)。
总的来说,这是个坏主意。你为什么要那样做?你依赖于类的结构(例如,如果你偶然在年龄之前添加一个成员,你的代码就会中断)并且你放弃封装(没有其他类应该有一个指向age的指针,因为它是私有的 - 你会泄露你对象表示。)
不过:你是Java程序员吗?您的构造函数看起来很像,因为您没有正确初始化对象。你应该这样做:Person(String n, int a) : age(a), name(s) {}
(否则编译器将首先调用int和string的默认contstructors,然后对它们调用operator = - 这样效率不高)。