相关疑难解决方法(0)

什么是聚合和POD以及它们如何/为何特殊?

常见问题解答涉及聚合和POD,并涵盖以下材料:

  • 什么是聚合
  • 什么是POD(普通旧数据)?
  • 它们有什么关系?
  • 它们如何以及为何特别?
  • C++ 11有什么变化?

c++ aggregate standard-layout c++11 c++17

525
推荐指数
6
解决办法
13万
查看次数

声明中的新C++ 11成员初始化功能是否使初始化列表过时了?

使用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++ constructor initialization declaration c++11

68
推荐指数
3
解决办法
4万
查看次数

如何在C++中选择堆分配与堆栈分配?

将其与其他语言区分开来的C++特性之一是能够将复杂对象分配为成员变量或局部变量,而不是总是必须分配它们new.但这导致了在任何给定情况下可以选择哪个问题.

是否有一些很好的标准来选择如何分配变量?我什么时候应该将成员变量声明为直接变量而不是作为引用或指针?什么时候应该分配一个变量new而不是使用在堆栈上分配的局部变量?

c++ scope memory-management software-design c++11

17
推荐指数
1
解决办法
4056
查看次数

C ++ 17中不可复制变量的成员初始化

在对不可复制变量(例如std::atomic<int>)执行成员初始化时,需要使用direct-initialization而不是copy-initialization根据此处的答案。然而,当我打开-std=c++17g++ 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++ initialization language-lawyer copy-elision c++17

16
推荐指数
1
解决办法
458
查看次数

是直接初始化还是复制初始化?

可以通过多种方式来初始化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节中比较了一些初始化样式(但不是全部):

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
};
Run Code Online (Sandbox Code Playgroud)

... …

c++ initialization initializer-list c++11 c++14

2
推荐指数
2
解决办法
776
查看次数