C ++构造函数运行时/编译时

时间:2013-01-01 21:41:07

标签: c++ dynamic constructor runtime compile-time

据我所知,我们可以在运行时或编译时创建对象。例如

SomeType object1;
SomeType *object2 = new SomeType;

所以我认为在这里的代码中;

int main(){

    cout << "lalalal";
    SomeType object1;
}

应该为object1调用构造函数,然后lalalal应该出现在屏幕上。因为编译器在程序启动之前分配内存。那么在什么时候我错了?

3 个答案:

答案 0 :(得分:5)

  

据我所知,我们可以在运行时或编译时创建对象。

不是真的。在您的代码示例中,第一个对象是使用自动存储持续时间(通常描述为“在堆栈上”)创建的,第二个对象是 已分配 动态存储持续时间(通常描述为“在堆上”)。但这些都是在运行时发生的。

  

应该为object1调用构造函数,然后lalalal应该出现在屏幕上。

函数中的语句从上到下执行(显然不包括循环)。因此,对象是第二个创建的。 *

  

因为编译器在程序启动之前分配内存。

是的,内存可能是提前分配的。但就可观察的效果而言,这是无关紧要的。

<小时/> *但是,由于你没有在字符串中包含换行符,你可能看到的是行缓冲的效果;在许多系统上,只有在收到换行符或程序终止之前,才会显示输出。

答案 1 :(得分:1)

首先,C ++中有两个独立的概念:存储持续时间, 和对象的生命周期虽然存储时间不能 比对象寿命短,反过来不一定 真正。第二,两者都是运行时概念,而不是编译时间。

然而,在这种情况下,没有真正的区别。这俩 存储持续时间和对象object1的生命周期开始 当定义执行时,并在它退出时结束 范围。实际上,大多数编译器将分配所有内存 对于函数顶部的局部变量,但仅仅是因为 合规程序无法证明它不是 在定义中分配。任何影响的东西 但是,当程序的可观察行为必须发生时 标准说它应该发生。

答案 2 :(得分:0)

不,您的示例中的object1在编译时未“创建”,它在运行时创建,就像其他对象一样。此外,object1在执行cout命令后被“构造”,因此之后执行它的构造函数。尽管如此,它的内存可能已经分配了。