C++11系列学习之七---------初始化列表
2015-09-08 20:57
471 查看
一、前言
C++的学习中,我想每个人都被变量定义和申明折磨过,比如我在大学笔试过的几家公司,都考察了const和变量,类型的不同排列组合,让你区别有啥不同。反正在学习C++过程中已经被折磨惯了,今天再来看看重温下那段“辉煌的历史”。先来看一段代码:
a,c,d 都是申明一个变量,a 很容易理解就是申明一个变量,b第一感觉是调用构造函数来申明变量,其实不是,而是申明一个无参数,返回Player的函数。对于c以为是调用了operator= 赋值运算吧?完全不是,而是先生成一个对象,然后调用Player的拷贝构造函数,生成对象pc。d和c是一样的。e才是真正调用赋值操作。是不是已经被这各式各样的对象申明搞的晕头专向了。现在C++11初始化列表正式登场。
二、简介
在看C++11初始化前,先来回忆一下C语言中的结构体初始化,代码如下:
结构体变量可以列表初始化,非常方便。C++11引入了初始化列表来初始化变量和对象。
三、如何使用
1、系统内置类型
很明显,还是d 更符合习惯。
通过初始化列表可以弥补c中只能初始化相同数字的问题。在使用中c和d不要混淆了。
还可以返回pair类型,初始化map都是可以的。
2、自定义类型
四、为啥需要初始化列表
1、避免类申明对象混淆,区分对待,对于C++为啥有小括号初始化对象这一说,大家可以自行google,看来不管是谁都有犯错误的时候,勇于承认错误还是好同志。
2、在初始化多个变量时方便
五、注意事项
1、在申明变量的时候,少用小括号,程序可读性更高
2、使用初始化列表防止隐式转换,减少bug
3、通过 {} 返回的对象是const类型,不可转换
六、std::initializer_list
请参考:
1.http://www.cppblog.com/liyiwen/archive/2009/07/26/91248.html
2.http://zh.cppreference.com/w/cpp/utility/initializer_list
3.http://www.oschina.net/translate/cplusplus-11-features-in-visual-cplusplus-2013-pre?p=2
C++的学习中,我想每个人都被变量定义和申明折磨过,比如我在大学笔试过的几家公司,都考察了const和变量,类型的不同排列组合,让你区别有啥不同。反正在学习C++过程中已经被折磨惯了,今天再来看看重温下那段“辉煌的历史”。先来看一段代码:
Player pa; // (a) Player pb(); // (b) Player pc = Player(); // (c) Player pd(Player()); // (d) pd = Player()
a,c,d 都是申明一个变量,a 很容易理解就是申明一个变量,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、自定义类型
<pre name="code" class="cpp">#include<iostream> #include<map> #include<string> #include<vector> using namespace std; class MyClass { public: MyClass(int _a, string _b) :a(_a), b(_b) { std::cout << "normal initializer list\n"; } private: int a; string b; }; int main() { MyClass m = { 1, "asd" }; MyClass y = m; MyClass y2(1, "asd"); MyClass y3{ 1, "asd" }; }
四、为啥需要初始化列表
1、避免类申明对象混淆,区分对待,对于C++为啥有小括号初始化对象这一说,大家可以自行google,看来不管是谁都有犯错误的时候,勇于承认错误还是好同志。
2、在初始化多个变量时方便
五、注意事项
1、在申明变量的时候,少用小括号,程序可读性更高
2、使用初始化列表防止隐式转换,减少bug
3、通过 {} 返回的对象是const类型,不可转换
六、std::initializer_list
请参考:
1.http://www.cppblog.com/liyiwen/archive/2009/07/26/91248.html
2.http://zh.cppreference.com/w/cpp/utility/initializer_list
3.http://www.oschina.net/translate/cplusplus-11-features-in-visual-cplusplus-2013-pre?p=2
相关文章推荐
- C++枚举类型
- C++之容器---vector
- 牛客面试常考算法题精讲部分题目c/c++代码
- C++中虚函数与纯虚函数以及虚继承的相关知识
- 关于C++中的常量与指针的关系
- C++11系列学习之六-----for
- 解决Win7下一个VC++6.0您不能直接打开多个project问题
- c++智能指针的使用
- C++ 防 陷阱4 指针参数传递内存
- C++11系列学习之五-------decltype
- C++用法的学习心得
- C++ Primer Plus 第6版 中文版 第5章编程练习
- Effective C++——条款30(第5章)
- C++11系列学习之四----auto
- C/C++ 拾遗
- c语言str类函数族
- 共享型智能指针的实现share_pointer
- 标准C++中的string类的用法詳解
- c++传CString到c#
- C++中extern “C”含义深层探索