如果malloc不创建新对象但只分配原始内存,为什么我能通过指向此内存的指针访问类成员?
#include <iostream>
using namespace std;
const float PI = 3.141592654;
class Circle{
float radius;
public:
Circle(){
cout << "Constructor called";
}
~Circle(){
cout << "Destructor called";
}
void Radius(){
cout << "Enter radius: ";
cin >> radius;
}
float Area(){
return PI * radius * radius;
}
void Display(){
cout << "The circle with radius " << radius
<< " units has area = " << this->Area() << " unit" << "\xFD\n";
}
};
int main(){
Circle *mCircle = (Circle *)malloc(sizeof(Circle));
mCircle->Radius();
mCircle->Display();
return 0;
}
任何人都可以引用此信息来源: 在C ++中,规则规定在调用构造函数之前不会创建对象。
答案 0 :(得分:3)
编译器会将对成员函数的调用转换为对静态函数的调用,并将隐含的this
参数指向该对象。这意味着对象的内容(有效或无效)与是否进行调用无关。
如果方法是虚拟的,则会更改,因为vtable指针必须有效。构造函数将初始化vtable指针。 malloc
没有调用构造函数,它甚至不知道构造函数是什么 - 它是来自C的剩余行李。
请注意,这是标准指定的 ,但通常是如何实现的。
答案 1 :(得分:2)
您可以访问已分配但未初始化的内存,但无法对内容进行有效假设。成员函数独立于对象存在,只是在this
指向未初始化的位置时调用它们。