构造函数被调用的次数

How many times the constructor is invoked?

本文关键字:调用 构造函数      更新时间:2023-10-16

我是c++编程的初学者,我有一个关于c++类构造函数的简单问题。为下面的代码片段调用构造函数多少次?

std::string s = std::string("hello world");

我猜是两个,对吧?第一个是string(const char* s),第二个是string(const string&如果我说错了,请纠正我。

下一个问题是,如果我在发布模式下编译代码,编译器会自动优化它吗?例如,把它当作std::string s("hello world");不同的编译器行为不同吗?

源类型与目标类型相同的复制初始化(使用=)的行为非常类似于直接初始化。这个初始化相当于:

std::string s(std::string("hello world"));

在没有优化的情况下,将像您描述的那样调用两个构造函数。在c++ 11中,移动构造函数将优先用于第二步(定义为string(string&&)),因为std::string("hello world")是一个右值表达式。然而,标准明确允许在某些情况下省略拷贝/移动,包括这个:

如果要将未绑定到引用(12.2)的临时类对象复制/移动到具有相同cv- undefined类型的类对象,则可以通过将临时对象直接构造为省略的copy/move

的目标来省略复制/移动操作。

因此,如果编译器选择的话,它可以优化掉副本。注意,即使复制构造函数有一些奇怪的副作用,编译器也可能这样做。也就是说,一个定义完美且有效的c++程序可能有多个可能的执行路径。一般来说,你要避免这种情况。

您的代码符合复制省略的条件,因此大多数正常的编译器总是将其视为std::string s("hello world");,除非明确指示不这样做。