博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++11之初始化列表
阅读量:5938 次
发布时间:2019-06-19

本文共 3294 字,大约阅读时间需要 10 分钟。

一、前言
     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 
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
va{1, 2, 3}; // (a) std::vector
vb = {1, 2, 3}; // (b) std::vector
vc(1, 10); // (c) std::vector
vd{1, 10}; // (d)
 
    通过初始化列表能够弥补c中仅仅能初始化同样数字的问题。在使用中c和d不要混淆了。
std::pair
getPlayer() { return {10001, "c++"}; } std::map
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
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
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类型,不可转换

转载地址:http://rpvtx.baihongyu.com/

你可能感兴趣的文章
React 组件通信之 React context
查看>>
ZooKeeper 可视化监控 zkui
查看>>
Linux下通过配置Crontab实现进程守护
查看>>
ios 打包上传Appstore 时报的错误 90101 90149
查看>>
Oracle推出轻量级Java微服务框架Helidon
查看>>
密码概述
查看>>
autoconf,automake,libtool
查看>>
jQuery的技巧01
查看>>
基于泛型实现的ibatis通用分页查询
查看>>
gopacket 使用
查看>>
AlertDialog对话框
查看>>
我的友情链接
查看>>
办公室几台电脑怎么连一台打印机的具体步骤
查看>>
linux安全---cacti+ntop监控
查看>>
鸟哥的linux私房菜-shell简单学习-1
查看>>
nagios配置监控的一些思路和工作流程
查看>>
通讯组基本管理任务三
查看>>
赫夫曼编码实现
查看>>
html页面显示div源代码
查看>>
基础复习-算法设计基础 | 复杂度计算
查看>>