C++统一初始化
.C++中指定初始化值的方式有4种方式:
()小括号 int x();
()等号 int x = ;
()大括号 int x{};
()等号和大括号 int x = {}; .C++11统一初始化, 即使用大括号初始化方式, 其使用场景主要有以下3种:
()类非静态成员指定默认值
()为容器赋值 vector<int> vec = {, , };
()对不支持拷贝操作的对象赋值 unique_ptr<int> p{};
之所以称为统一初始化, 其原因在于上述3种使用场景中,
第()种不支持小括号;
第()种不支持等号和小括号;
第()种不支持等号. .统一初始化的优势:
()能禁止内置类型之间的隐式窄化转换, 即表达式无法保证接收对象能够表达其值, 则代码不能通过编译(至少会给出编译警告)!
如 double d{}; long x{d};
()可以有效解决小括号定义对象却解析为声明函数的问题.
如 int x(); 声明为函数 x 而不是定义变量, 使用统一初始化则不会出现问题. .统一初始化的不足:
不足之处在于重载匹配过程变得更加复杂, 难于理解:
()对重载函数, 统一初始化使用大括号会将数据声明为 initializer_list 对象,
只有重载匹配过程中, 无法找到 initializer_list类型的形参时, 其它函数才会成为可选函数.
因此, 对声明了 initializer_list 形参的重载函数, 则使用统一初始化的代码会优先匹配该函数, 而其他更精确匹配的版本可能没有机会被匹配.
其中需要特别注意的是经常使用容器 vector.
如 vector<int> vec(, ) 和 vector<int> vec{,}, 前者是含有 个元素的对象, 而后者是只包含 和 两个元素的对象.
()对于构造函数, 空大括号构造一个对象时, 不是匹配 initializer_list 形参的版本, 而是默认构造函数.
class Test
{
public:
Test()
{
PRINT_POS();
}
template <typename T>
Test(std::initializer_list<T> ls)
{
Q_UNUSED(ls);
PRINT_POS();
}
};
进行如下调用时,
Test t1{};
Test t2{};
// Test t3{{}}; //error: no matching function for call to 'Test::Test(<brace-enclosed initializer list>)'
Test t4{{}};
Test t5({});
其中 t1 和 t5 使用默认构造函数, t2 和 t4 使用列表初始化构造函数, t3 则不能定义.
()对于 initializer_list 模板特例化版本, 情形较第2种又有所不同.
a. void foo(int);
b. template <typename T>
void foo(initializer_list<T> lsi);
当进行以下函数调用 foo(); foo({}); foo({}); 时, 分别调用的是 a, a, b.
c. void foo(int);
d. void foo(initializer_list<int> lsi);
当进行以下函数调用 foo(); foo({}); foo({}); 时, 分别调用的是 c, d, d.
C++统一初始化的更多相关文章
- C++11 带来的新特性 (2)—— 统一初始化(Uniform Initialization)
1 统一初始化(Uniform Initialization) 在C++ 11之前,所有对象的初始化方式是不同的,经常让写代码的我们感到困惑.C++ 11努力创造一个统一的初始化方式. 其语法是使用{ ...
- 【ZZ】C++11之统一初始化语法 | 桃子的博客志
C++11之统一初始化语法 | 桃子的博客志 https://taozj.net/201710/list-initialize.html 在当前新标准C++11的语法看来,变量合法的初始化器有如下形式 ...
- C++统一初始化语法(列表初始化)
引言 要是世上不曾存在C++14和C++17该有多好!constexpr是好东西,但是让编译器开发者痛不欲生:新标准库的确好用,但改语法细节未必是明智之举,尤其是3年一次的频繁改动.C++带了太多历史 ...
- Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public H ...
- C++11初始化列表
[C++11之初始化列表] 在C++03中,在严格遵守POD的定义和限制条件的结构及类型上可以使用初始化列表(initializer list),构想是结构或是数组能够依据成员在该结构内定义的顺序通过 ...
- tomcat生命周期的管理——生命周期统一接口Lifecycle
我们知道Tomcat的架构设计是清晰的.模块化的,其拥有很多组件,假如我们要启动Tomcat,可以一个一个启动组件,但这样启动有很多缺点,不仅麻烦,而且容易漏了组件启动,还会对后面动态组件扩展带来麻烦 ...
- C++11 列表初始化
在我们实际编程中,我们经常会碰到变量初始化的问题,对于不同的变量初始化的手段多种多样,比如说对于一个数组我们可以使用 int arr[] = {1,2,3}的方式初始化,又比如对于一个简单的结构体: ...
- C++11 初始化
C++11 初始化 统一初始化语法 C++11新添加初始化列表 std::initializer_list<>类型,可以通过{}语法来构造初始化列表 .初始化列表是常数:一旦 ...
- NO.4: 确定对象被使用前已被初始化
1.为内置对象进行 "手工初始化",因为C++不保证初始化他们(内置类型在赋值与初始化销毁基本相同,最好还是进行初始化列表),在内置类型过多情况下,可选择private函数统一初始 ...
随机推荐
- 测试效率 timeit cProfile
timeit使用 def f1(lIn): l1 = sorted(lIn) # O(nlogn) C语言的 l2 = [i for i in l1 if i<0.5] # O(n) retur ...
- LeetCode 655. Print Binary Tree (C++)
题目: Print a binary tree in an m*n 2D string array following these rules: The row number m should be ...
- PSP Daily软件beta版本——基于spec评论
题目要求: 每个小组评论其他小组beta发布作品的软件功能说明书. 试用(并截图)所有其他小组的beta作品,与软件功能说明书对比,评论beta作品对软件功能说明书的实现. 根据软件功能说明书,测试所 ...
- TeamWork#2,Week 2,We are sixsix!
We are sixsix! (从左至右依次是:郝倩.张志浩.高雅智[高哥].牛强.张明培育.彭林江.王卓) 郝倩,来自120617班,我们组7个成员中唯一一个6行政班以外的成员.为了达成组队条件,彭 ...
- No.0_Team C#
杜正远 略宅,喜昼伏夜出,却又喜游山玩水.平日多出现于宿舍食堂实验室,其他地方鲜有涉足.热爱编程与电脑游戏,渴望自己能写一款自己喜欢玩的电脑游戏,并以此为目标. 喜欢研究算法,但不喜欢硬件.正在入门软 ...
- Hibernate连接数据库一直报NullPointerException
原来是少了这个.. //private HibernateTemplate hibernateTemplate; //少了下面 public HibernateTemplate getHibernat ...
- 结对作业:基于GUI实现四则运算
1)Coding.Net项目地址:https://git.coding.net/day_light/GUIszysLL.git 2)在开始实现程序之前,在下述PSP表格记录下你估计将在程序的各个模块的 ...
- 树莓派与Arduino Leonardo使用NRF24L01无线模块通信之基于RF24库 (一) 配置与测试
引脚连接说明 与树莓派的连线 NRF24L01 => 树莓派 GND => GND VCC => 3.3V CE = ...
- angularJS1笔记-(11)-自定义指令(transclude/priority/terminal)
自定义指令的属性 transclude:为true时,允许把html中新定义的指令中原来的dom运用到该指令的template中. 属性priority,设置该指令的优先级,优先级大的先执行,默认指令 ...
- SCRUM:第一、二天任务实现情况
在团队项目“广商百货”的SCRUM项目中我认领的任务: LOGO设计 5.18熬夜完成LOGO设计(投票通过): 设计理念: 1.全矢量图设计,适应各种超大尺寸使用: 2.3D化透视设计,简约视效,也 ...