在非现有对象上调用成员函数正常工作,c ++

时间:2014-04-20 20:37:44

标签: c++ constructor casting reinterpret-cast

请考虑以下代码:

#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的对象被建构?

3 个答案:

答案 0 :(得分:2)

当调用成员函数g()时,编译器只是将其作为指向对象的指针的第一个参数传递给它(即,将您解释为someClass *的void *类型的已分配数组的元素)。该函数不使用此指针来访问该类的任何数据成员。事实上,对于这个简单的类,构造函数不需要构造任何东西。该类没有数据成员。所以调用函数没有问题。

答案 1 :(得分:1)

someClass是一个没有州的班级。  毫无疑问,g()不像vtable指针那样处理,而是常规函数。

你在这里做的是未定义的行为迎合直觉,reinterpret_cast,而不是规格。

答案 2 :(得分:0)

已经为someClass对象进行了内存分配,并调用了new。但是,由于调用是new void而不是new someClass,因此它没有调用someClass构造函数。

g()的调用有效,因为this指针已被分配。永远不会执行构造函数操作。