此常见问题解答涉及聚合和POD,并涵盖以下材料:
使用C++ 11,我们现在可以在头声明中初始化类成员:
class aClass
{
private:
int mInt{100};
public:
aClass();
~aClass();
};
Run Code Online (Sandbox Code Playgroud)
所以我有点困惑.传统上,构造函数中的初始化列表已用于成员初始化:
aClass::aClass()
: mInt(100)
{
...
}
Run Code Online (Sandbox Code Playgroud)
声明中的新C++ 11成员初始化功能是否使初始化列表过时了?如果没有,一个优于另一个的优势是什么?什么情况会使声明初始化有利,或初始化列表有利?应该何时使用另一个?
将其与其他语言区分开来的C++特性之一是能够将复杂对象分配为成员变量或局部变量,而不是总是必须分配它们new.但这导致了在任何给定情况下可以选择哪个问题.
是否有一些很好的标准来选择如何分配变量?我什么时候应该将成员变量声明为直接变量而不是作为引用或指针?什么时候应该分配一个变量new而不是使用在堆栈上分配的局部变量?
在对不可复制变量(例如std::atomic<int>)执行成员初始化时,需要使用direct-initialization而不是copy-initialization根据此处的答案。然而,当我打开-std=c++17的g++ 7.4.0,似乎后者也是行之有效的。
#include <atomic>
class A {
std::atomic<int> a = 0; // copy-initialization
std::atomic<int> b{0}; // direct-initialization
};
Run Code Online (Sandbox Code Playgroud)
$ g++ -c atomic.cc -std=c++11 // or c++14
atomic.cc:4:26: error: use of deleted function ‘std::atomic<int>::atomic(const std::atomic<int>&)’
std::atomic<int> a = 0; // copy-initialization
$ g++ -c atomic.cc -std=c++17
// no error
Run Code Online (Sandbox Code Playgroud)
与编译时,它也没有g++ 6.5.0,甚至有-std=c++17。这里哪一个是正确的?
可以通过多种方式来初始化C ++中的对象(类或结构的实例)。某些语法引起对象的直接初始化,而其他语法则导致复制初始化。随着拷贝省音在编译器中启用,两者具有相同的性能。在禁用复制删除的情况下,当您为每个实例选择复制/初始化时,都会有一个附加的复制/移动构造函数调用(复制初始化)。
结论:复制初始化可能会降低性能!
来自以下问题:C ++ 11成员初始值设定项列表与类初始值设定项?我可以得出结论,这将是复制初始化语法:
obj s = obj("value");
Run Code Online (Sandbox Code Playgroud)
这将是直接初始化语法:
obj s{"value"};
Run Code Online (Sandbox Code Playgroud)
但是这个呢?
obj s = {"value"};
Run Code Online (Sandbox Code Playgroud)
还有这个:
obj s = obj{"value"};
Run Code Online (Sandbox Code Playgroud)
还有这个:
obj s("value");
Run Code Online (Sandbox Code Playgroud)
或者这个:
obj s = "value";
Run Code Online (Sandbox Code Playgroud)
注意
Bjarne Stroustrup在他的书“使用C ++编程,原理和实践”第二版,第311页,第9.4.2节中比较了一些初始化样式(但不是全部):
Run Code Online (Sandbox Code Playgroud)struct Date { int y,m,d; //year, month, day Date(int y, int m, int d); //check for valid date and initialize void add_day(int n); //increase the Date by n days };... …
c++ ×5
c++11 ×4
c++17 ×2
aggregate ×1
c++14 ×1
constructor ×1
copy-elision ×1
declaration ×1
scope ×1