考虑以下代码:
#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类型的对象?
最佳答案
当调用成员函数 g() 时,编译器只需将指向对象的指针(即指向您解释为 someClass * 的已分配数组的 void * 类型的元素)作为第一个参数传递给它。该函数不使用此指针来访问该类的任何数据成员。事实上,对于这个简单的类,构造函数不需要构造任何内容。该类没有数据成员。所以调用该函数是没有问题的。
关于c++ - 在不存在的对象上调用成员函数可以正常工作,c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23187319/