请考虑以下代码:
#include <iostream>
using namespace std;
class someClass
{
public:
someClass(){ cout<<"someClass"<<endl; }
void g() const { cout<<"g()"<<endl;}
};
int main()
{
void* memory = new void*[5*(sizeof(someClass)/sizeof(char))];
someClass *someClassArray = reinterpret_cast<someClass*>(memory);
for(int i=0;i<5;i++)
{
someClassArray[i].g();
}
}
此代码的输出为:
g()
g()
g()
g()
g()
这意味着没有调用构造函数。但是在数组someClassArray是someClass类型的注入,我可以调用g()函数并获得正确的输出。
为什么这个程序是正确执行的,而没有类型someClass的对象被建构?
答案 0 :(得分:2)
当调用成员函数g()时,编译器只是将其作为指向对象的指针的第一个参数传递给它(即,将您解释为someClass *的void *类型的已分配数组的元素)。该函数不使用此指针来访问该类的任何数据成员。事实上,对于这个简单的类,构造函数不需要构造任何东西。该类没有数据成员。所以调用函数没有问题。
答案 1 :(得分:1)
someClass
是一个没有州的班级。
毫无疑问,g()不像vtable指针那样处理,而是常规函数。
你在这里做的是未定义的行为迎合直觉,reinterpret_cast,而不是规格。
答案 2 :(得分:0)
已经为someClass对象进行了内存分配,并调用了new
。但是,由于调用是new void
而不是new someClass
,因此它没有调用someClass构造函数。
g()
的调用有效,因为this
指针已被分配。永远不会执行构造函数操作。