默认构造函数如何知道在哪里初始化数据成员在内存中的默认值

时间:2018-12-18 11:37:44

标签: c++ constructor

本书“ 构造函数的第一个隐藏参数是this指针” 现在,当我们像

classname object;

就像创建对象的第一个内存并将对象的地址传递给默认构造函数一样,以便它可以初始化类的值。

如果这是对象的概念,那么如何创建内存,是操作系统创建的吗?

3 个答案:

答案 0 :(得分:2)

这取决于您在哪里编写定义:

  • 如果您在全局范围内定义对象,则链接程序将确定在程序的数据区域中放置对象的位置,并确保有足够的空间。无论所有静态对象是静态类成员还是函数局部静态对象,都是如此。
  • 如果在函数中将对象定义为本地对象,它将被放置在堆栈中。使用的系统上的调用约定将在堆栈上安排足够的空间(假设堆栈上有足够的空间来开始;否则,将会导致堆栈溢出)。
  • 如果您的定义实际上是成员声明,​​则将在包含对象中留出该对象的空间,并将新对象放置在其中。
  • 出于完整性考虑,使用new表达式时,空间是分配在堆上的,而对象则放置在堆上。
  • 另一种情况是线程本地对象放置在线程堆栈中的某个位置。

请注意,对象的放置适用于所有构造函数:默认构造函数的唯一含义是构造对象时您不传递任何参数。

答案 1 :(得分:1)

正如约翰在评论中提到的那样,标准中没有关于如何分配/管理内存的明确信息。但是,假设没有进行任何编译器优化,并且您正在堆栈上创建对象...那么这将可能发生。

给出:

void f()
{
    foo x;
}

编译器将生成类似以下内容的

void f()
{
    char foo_buffer[sizeof(foo)];
    new (&foo_buffer) foo()
    reinterpret_cast<foo*>(foo_buffer)->~foo();
}

foo实例的空间在堆栈上保留,然后在该空间上调用构造函数。在作用域的最后,调用了析构函数。

答案 2 :(得分:-2)

创建对象时,操作系统将创建空间。创建对象时,操作系统会自动调用默认构造函数。