c++11之初始化列表
C++的学习中。我想每一个人都被变量定义和申明折磨过,比方我在大学笔试过的几家公司。都考察了const和变量,类型的不同排列组合,让你差别有啥不同。反正在学习C++过程中已经被折磨惯了,今天再来看看重温下那段“辉煌的历史”。先来看一段代码:
Player pa; // (a)
Player pb(); // (b)
Player pc = Player(); // (c)
Player pd(Player()); // (d)
pd = Player() // (e)
a,c,d 都是申明一个变量,a 非常easy理解就是申明一个变量,b第一感觉是调用构造函数来申明变量。事实上不是,而是申明一个无參数,返回Player的函数。
对于c以为是调用了operator= 赋值运算吧?全然不是。而是先生成一个对象。然后调用Player的拷贝构造函数,生成对象pc。d和c是一样的。e才是真正调用赋值操作。是不是已经被这各式各样的对象申明搞的晕头专向了。如今C++11初始化列表正式登场。
二、简单介绍
在看C++11初始化前,先来回顾一下C语言中的结构体初始化。代码例如以下:
#include <iostream>
struct Player{
int id;
const char* name;
};
int main() {
Player player = {10001, "c++"};
printf("%d, %s\n", player.id, player.name);
}
结构体变量能够列表初始化,非常方便。
C++11引入了初始化列表来初始化变量和对象。
三、怎样使用
1、系统内置类型
int ia{1}; // (a)
int ib = {1}; // (b)
int ic(1); // (c)
int id = 1; // (d)
非常明显。还是d 更符合习惯。
std::vector<int> va{1, 2, 3}; // (a)
std::vector<int> vb = {1, 2, 3}; // (b)
std::vector<int> vc(1, 10); // (c)
std::vector<int> vd{1, 10}; // (d)
通过初始化列表能够弥补c中仅仅能初始化同样数字的问题。在使用中c和d不要混淆了。
std::pair<int, const char*> getPlayer() {
return {10001, "c++"};
}
std::map<int, const char*> players = {{10001, "c++"}, {10002, "java”}};
还能够返回pair类型。初始化map都是能够的。
2、自己定义类型
对于单个參数初始化,类型匹配构造函数,不须要自己定义构造函数。
Player pa{}; // (a)
Player pb; // (b)
Player pc(); // (c)
Player pd(b); // (d)
Player pe = b; // (e)
Player pf = {b}; // (f)
对于上面几种变量初始化,推荐a, 假设是带參数的构造函数,推荐b,若果是不带參数的构造函数。
3、假设是自己想实现初始化列表构造函数。拷贝函数,赋值函数,须要包括initializer_list 这个头文件。
class MyClass{
public:
MyClass(int a):a_(a){
std::cout << "normal initializer list\n";
}
MyClass(std::initializer_list<int> a):b_(a) {
std::cout << "initializer list constructor\n";
}
MyClass(MyClass& my) {
std::cout << "copy constructor\n";
this->a_ = my.a_;
this->b_ = my.b_;
}
MyClass& operator=(MyClass& my) {
std::cout << "operator = constructor\n";
this->a_ = my.a_;
this->b_ = my.b_;
return *this;
}
private:
int a_;
std::initializer_list<int> b_;
};
这是自己定义类,带有初始化列表构造函数的类,以下来练习下学过的类相关C++知识:
MyClass ma{1}; // (a)
MyClass mb = {1, 2, 3}; // (b)
MyClass mc(2); // (c)
MyClass md = b; // (d)
MyClass me(c); // (e)
MyClass mf{e}; // (f)
auto l{2, 2, 3,3};
MyClass mh{l}; // (e)
ma = mb; // (h)
看一下每次调用都输出什么结果,答案在这里:
initializer list constructor
initializer list constructor
normal constructor list
copy constructor
copy constructor
copy constructor
initializer list constructor
operator = constructor
四、为啥须要初始化列表
1、避免类申明对象混淆,区分对待,对于C++为啥有小括号初始化对象这一说,大家能够自行google。看来无论是谁都有犯错误的时候。勇于承认错误还是好同志。
2、在初始化多个变量时方便
3、避免数据分割,由于通过初始化列表是不同意隐式转换的,相关知识能够參考我的这篇文章。
五、注意事项
1、在申明变量的时候,少用小括号,程序可读性更高
2、使用初始化列表防止隐式转换,降低bug
3、通过 {} 返回的对象是const类型,不可转换
c++11之初始化列表的更多相关文章
- C++11的初始化列表
初始化是一个非常重要的语言特性,最常见的就是对对象进行初始化.在传统 C++ 中,不同的对象有着不同的初始化方法,例如普通数组.POD (plain old data,没有构造.析构和虚函数的类或 ...
- C++11初始化列表
[C++11之初始化列表] 在C++03中,在严格遵守POD的定义和限制条件的结构及类型上可以使用初始化列表(initializer list),构想是结构或是数组能够依据成员在该结构内定义的顺序通过 ...
- C++11新特性——初始化列表 initializer_list
破事水: 由于最近数据结构有个实验报告说是要对字符串进行排序,想偷个懒不想一个一个地赋值,虽然可以用strcpy和传入二级指针的形式直接写,但是这样感觉不美观漂亮. 然后就去膜了一下C++11的新特性 ...
- C++-什么时候需要在类的构造函数中使用初始化列表
1,如果基类没有default构造函数,则意味着其不能自己初始化.如果其被派生,派生类的构造函数要负责调用基类的构造函数,并传递给它需要的参数.下例中Base 2,如果类成员没有默认构造函数.下例中E ...
- 从零开始学C++之构造函数与析构函数(二):初始化列表(const和引用成员)、拷贝构造函数
一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段 初始化段 普通计算段 (一).对象成员及其初始化 C++ Code 1 2 3 4 5 6 7 8 9 1 ...
- C++: 类成员初始化列表语法
类的成员初始化列表的初始化的基本语法,类的构造函数还可以运用此语法为其变量初始化: class Class { private: int a; int b; char ch; public: Cl ...
- 初始化列表(const和引用成员)、拷贝构造函数
一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段 初始化段 普通计算段 (一).对象成员及其初始化 C++ Code 1 2 3 4 5 6 7 8 9 1 ...
- initializer_list、初始化列表、列表初始化
什么是列表初始化 使用一个花括号来初始化变量,表现形式如下: std::vector<int>a{1,2,3,4,5}; 或者 std::vector<int>a = {1,2 ...
- C++中的初始化列表
C++11扩大了列表初始化的适用范围,使其可以用于所有内置类型和用户定义的类型(即类对象). 1.当列表初始化用于内置类型的变量时,这种初始化形式有一个重要的特点:如果我们使用列表初始化且初始化值存在 ...
随机推荐
- 【习题 7-6 UVA - 12113】Overlapping Squares
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 先预处理出来一个正方形. 然后每次枚举新加的正方形左上角的坐标就可以. 注意覆盖的规则,控制一下就可以. 然后暴力判断是否相同. 暴 ...
- 【Educational Codeforces Round 35 A】 Nearest Minimums
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 找出最小的数字的位置. 最近的肯定是相邻的某对. [代码] #include <bits/stdc++.h> using ...
- 【AIM Tech Round 4 (Div. 2) C】Sorting by Subsequences
[链接]http://codeforces.com/contest/844/problem/C [题意] 水题,没有记录意义 [题解] 排序之后,记录每个数字原来在哪里就好. 可以形成环的. 环的个数 ...
- Objc执行时读取和写入plist文件遇到的问题
以下是本猫保持游戏NPC和物件交互的plist文件: 随着游戏和玩家逐步发生互动,玩家会改动人物和物件的交互的状态.这也是RPG游戏最主要的功能. 在切换每一个地图时须要将上一个地图发生的改变存储到p ...
- ViewPager+Fragmrnt最简单结合方法
Fragment和ViewPager 本博文系本菜鸟第一次博文展示,有错误之处请虽然提出 FragmentPagerAdapter 谷歌官方提供了这么一个adapter(FragmentPagerAd ...
- 【JavaScript】--JavaScript总结一览无余
对于 北风网李炎恢老师的JavaScript的视频也真的是醉了.视频整体来说结构清晰.内容比較简单.JS是一种灵活,开放的语言,语法规则并没有那么的死板.非常easy让人接受. JS的基础部分跟C#类 ...
- zookeeper 配置文件说明(zoo.cfg)
clientPort # 客户端连接server的port,即对外服务port,一般设置为2181. dataDir # 存储快照文件snapshot的文件夹. 默认情况下.事 ...
- setting-在设置中添加新的选项
如下图的“通知栏调出方式” 具体实现如下 1.在 res/xml/settings_headers.xml 文件中添加如下内容 <preference-headers xmlns:android ...
- 库函数strcpy/strlen的工作方式
库函数strcpy/strlen的工作方式 分类: C/C++ 2011-07-03 23:49 1032人阅读 评论 ...
- 基于深度学习的目标检测(object detection)—— rcnn、fast-rcnn、faster-rcnn
模型和方法: 在深度学习求解目标检测问题之前的主流 detection 方法是,DPM(Deformable parts models), 度量与评价: mAP:mean Average Precis ...