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 的遗留包袱。
请注意,这不是标准指定的,但通常是这样实现的。
如果 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 的遗留包袱。
请注意,这不是标准指定的,但通常是这样实现的。