c++ - 在不存在的对象上调用成员函数可以正常工作,c++

标签 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类型的对象?

最佳答案

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

关于c++ - 在不存在的对象上调用成员函数可以正常工作,c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23187319/

相关文章:

c++ - 动态规划中如何选择缓存的初始值?

c++ - 我如何在 Eigen 中创建复数矩阵

c++ - 如何在c++/cli中正确释放Bitmap的 'external'像素数据

swift - 在 Swift 中,你能写一个扩展,它返回扩展所在类的类型化实例吗?

c++ - 在测试之间清除 Boost Test Fixture 对象

python - Tkinter:使用附加参数对 Button 进行子类化

c++ - 继承和初始化顺序

c++ - 调试器卡在函数开始处

具有父类(super class)引用的 java 转换

casting - 整数类型转换如何在 Java 互操作中工作?