在C++ 11中初始化对象成员变量的这些方法有何不同?还有另外一种方法吗?哪种方式更好(性能)?:
class any {
public:
obj s = obj("value");
any(){}
};
Run Code Online (Sandbox Code Playgroud)
要么
class any {
public:
obj s;
any(): s("value"){}
};
Run Code Online (Sandbox Code Playgroud)
谢谢.
DIRECT-VS COPY-INITIALIZATION
通过这个问题(它是直接初始化还是复制初始化?)我学到了直接初始化和复制初始化之间的区别:
Run Code Online (Sandbox Code Playgroud)direct-initialization copy-initialization ----------------------- --------------------- obj s("value"); obj s = obj("value"); obj s = "value"; obj s{"value"}; obj s = {"value"}; obj s = obj{"value"};
为了完整起见,我在这里提到它.我对此页面的实际问题列在下一段>>
直接初始化与直接列表初始化
答案显示,在直接初始化的范畴内,可以在直接初始化和直接列表初始化之间产生差异.
Run Code Online (Sandbox Code Playgroud)obj s("value"); // direct-initialization obj s{"value"}; // direct-list-initialization
我知道列表初始化不允许缩小,这样初始化int x{3.5};就不会编译.但除此之外,我还有几个问题:
(1)
obj s("value");和之间的编译器输出有什么不同obj s{"value"};吗?
让我们考虑一个没有任何优化的编译器.我想知道任何可能的技术差异:-)
(2)也许我应该问一个多变量初始化完全相同的问题,例如:
obj s("val1", "val2");和obj s{"val1", "val2"};
(3)我注意到列表初始化有时可以调用不同的构造函数,如:
vector<int> a{10,20}; //Curly braces -> fills the …Run Code Online (Sandbox Code Playgroud) 考虑以下程序.
#include <iostream>
int main()
{
int a=int{};
std::cout<<a;
}
Run Code Online (Sandbox Code Playgroud)
它是使用聚合初始化还是默认初始化?我很迷惑.