类C,构造函数和统一初始化之间有什么区别?

Dayuloli:

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

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

C ++ 11引入了统一的初始化,以提供更统一的语法来初始化不同类型的变量,这在C ++ 03中需要不同的语法

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

nasser-sh:

首先,我建议您看一下赫伯·萨特(Herb Sutter)以下演讲,他在演讲中就该主题提供了一些建议。大括号初始化讨论在23:00左右开始

当您谈论原始数据类型时,所有这三种都会产生相同的结果。我个人更喜欢使用旧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_listvar以其作为标识符。

关于初始化程序列表的事情是,它们提供了一致性,这是对先前可用列表的可喜变化。例如,如果要使用C ++初始化数组,则可以使用:

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

但是,如果要vector<int>使用相同的元素初始化a ,则必须:

  1. 首先初始化上面的arr,然后通过arrarr + 4
  2. 分别或循环创建矢量和push_back()元素。

使用C ++ 11,您可以使用

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

大括号初始化很有用的另一个实例是,它提供了解决C ++ 最烦人的语法的方法从谈话中,假设我们有两个类,originextents,可以将其实例传递给构造另一个type对象rectangle以下语句:

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

不允许您rectangle使用originextents临时对象创建对象,因为该语句被解析为函数声明。sk 因此,通常,您必须执行以下操作:

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

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

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

将按预期工作,即传递给构造函数,该构造函数将origin第一个参数作为extents对象,第二个作为对象进行重载

该规则适用于对象,除非有理由不要使用花括号初始化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用构造函数初始化类实例与赋值之间有什么区别吗?

在构造函数内外初始化实例变量之间有什么区别?

C ++ 11统一初始化:初始化列表和多参数构造函数之间的歧义?

对象初始化程序和构造函数有什么区别?

骨干模型上的初始化和构造函数有什么区别

在 C++ 中使用和不使用构造函数调用初始化对象有什么区别

使用初始化列表初始化字段并在构造函数内部对其进行初始化之间有什么区别?

快速初始化和便捷实例之间的便利初始化与初始化之间有什么区别

用=初始化和{}初始化之间有什么区别?

在 C++11/17 中的类初始化和直接初始化中。有什么区别?

CRTP 基私有构造函数和派生的友元类使用 C++17 和统一初始化导致编译错误

使用带有和不带有return语句的函数初始化JavaScript对象之间有什么区别?

在函数中返回指向被调用的int的指针和返回已初始化的int的地址之间有什么区别?

Dart中的构造方法和初始化方法列表有什么区别?

这些对象初始化之间有什么区别?

{x}和'= {x}'初始化之间有什么区别(如果有)?

C初始化程序元素不是常量[数组和变量之间有什么区别]

实例初始值设定项和构造函数之间有什么区别?

Java枚举和具有私有构造函数的类之间有什么区别?

使用ori和addi在MIPS中初始化值之间有什么区别?

直接声明和初始化返回码之间有什么区别吗?

初始化字符串时,“ ...”和“ ...”之间有什么区别?

声明一次给数组赋值或用C#创建和初始化数组之间有什么区别?

R S4初始化函数中的“ .Object”和“ object”有什么区别?

C ++ 11统一初始化和函数重载

(function(global){}(this),构造函数和Javascript类之间有什么区别?

类构造函数内的函数和内部类但外部构造函数(在js中)之间的方法有什么区别?

所需的初始化程序和指定的初始化程序有什么区别?

将类作为最终类和将类构造函数作为私有之间有什么区别