malloc 是否创建 class 的新实例?

Does malloc create a new instance of the class or not?

如果 malloc 不创建新对象而只分配原始内存,为什么我可以通过指向该内存的指针访问 class 成员?

#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++ 中,规则规定在调用构造函数之前不会创建对象。

您可以访问已分配但未初始化的内存,但您不能对内容做出有效的假设。成员函数独立于对象存在,它们只是通过 this 指向未初始化的位置被调用。

编译器会将对成员函数的调用转换为对静态函数的调用,隐含的 this 参数指向该对象。这意味着对象的内容,有效或无效,与是否进行调用无关。

如果方法是虚拟的,这会发生变化,因为 vtable 指针必须有效。构造函数将初始化 vtable 指针。 malloc 调用构造函数,它甚至不知道构造函数是什么——它是 C 的遗留包袱。

请注意,这不是标准指定的,但通常是这样实现的。