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

bar*_*can 1 c++ constructor runtime dynamic compile-time

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

SomeType object1;
SomeType *object2 = new SomeType;
Run Code Online (Sandbox Code Playgroud)

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

int main(){

    cout << "lalalal";
    SomeType object1;
}
Run Code Online (Sandbox Code Playgroud)

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

Oli*_*rth 5

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

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

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

函数中的语句从上到下执行(显然不包括循环).所以该对象是第二个创建的.*

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

是的,可能是提前分配内存.但就可观察到的影响而言,这是无关紧要的.


*但是,由于您没有在字符串中包含换行符,您可能会看到的是行缓冲的效果; 在许多系统上,直到收到换行符或者程序终止之前,才会显示输出.