gpt4 book ai didi

c++ - C-like、构造函数和统一初始化之间有什么区别?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:42:14 26 4
gpt4 key购买 nike

据我所知,在 C++ 中有三种初始化变量的方法。

int x = 0;    // C-like initialization
int x (0); // Constructor initialization
int x {0}; // Uniform initialization

C++11 进行了统一初始化为初始化不同类型的变量提供更统一的语法,这在 C++03 中需要不同的语法.

类 C、构造函数和统一初始化之间有什么区别?我应该始终使用统一初始化吗?

最佳答案

首先,我建议查看 following talk由 Herb Sutter 撰写,他在其中给出了有关该主题的一些建议。大括号初始化讨论从 around 23:00 开始。 .

当您谈论原始数据类型时,所有 3 种都会产生相同的结果。我个人更喜欢坚持使用旧的 int x = 0语法,但这归结为个人喜好。

对于类类型,大括号初始化和老式构造函数初始化不能完全互换。例如:

vector<int> v (100); // Creates a 100-element vector
vector<int> v {100}; // Creates a 1-element vector, holding the value 100.

这是因为 std::vector有一个显式定义 std::initializer_list 的构造函数作为其唯一的论据。请记住

auto var = {1, 2};

创建一个 std::initializer_list , 与 var作为它的标识符。

关于初始化列表的事情是它们提供了一致性,这是对之前可用内容的可喜变化。例如,如果您要在 C++ 中初始化一个数组,您将使用:

int arr[] = {1, 2, 3, 4};

但是,如果你想初始化一个 vector<int>对于相同的元素,您要么必须:

  1. 先初始化上面的arr,然后传arrarr + 4
  2. 单独或循环创建 vector 和 push_back() 元素。

对于 C++11,你可以只使用

vector<int> v = {1, 2, 3, 4}; // Same syntax. Nice! Note that the = is optional

大括号初始化有用的另一个实例是它为 C++ 的 most vexing parse 提供了一种解决方法。 .从谈话中,假设我们有两个类(class),originextents ,可以传递其实例以构造另一个类型为 rectangle 的对象.以下声明:

rectangle w(origin(), extents());

不允许您创建 rectangle对象使用 originextents临时文件,因为该语句被解析为函数声明。啧啧。所以通常情况下,你必须这样做:

origin  o;
extents e;
rectangle w(o, e);

通过大括号初始化,您可以即时创建它们,并且

rectangle w {origin(), extents()};

将按预期工作,即传递给用 origin 重载的构造函数对象作为它的第一个参数和一个 extents对象作为第二个。

规则是针对对象,除非有理由不这样做,否则请使用大括号初始化。

关于c++ - C-like、构造函数和统一初始化之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47400080/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com