构造函数被调用的次数
How many times the constructor is invoked?
我是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");
,除非明确指示不这样做。
相关文章:
- 在c++中使用向量时,如何调用构造函数和析构函数
- C++:考虑但不调用构造函数的特殊性
- 对象实例化调用构造函数的次数太多
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- C ++:通过大括号调用构造函数?
- 不能调用构造函数
- 赋值 boost::intrusive_ptr 而不调用构造函数?
- 在模板化类的构造函数中调用构造函数
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 我不明白在这个例子中什么时候调用构造函数
- 调用c++构造函数的不同方法
- 调用构造函数与将内联常量定义为默认参数
- 如何通过 Rust FFI 调用C++构造函数?
- "new"运算符是否总是调用构造函数?
- 无法调用构造函数
- 使用 "()" 调用构造函数不同于"{}"
- 确定是调用构造函数还是强制转换运算符的因素