ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CPP11-初始化列表

2022-02-14 17:22:47  阅读:149  来源: 互联网

标签:初始化 name int age list 列表 CPP11 Student


在CPP11之前的不同对象都有各自的初始化方式,于是初始化列表特性的目的在于统一初始化环节

统一初始化

提供了基本类型、数组、自定义类型等不同对象的初始化

class Student
{
public:
    Student(string name, int age) 
        : m_name(name), m_age(age) {
        cout << __FUNCTION__ << endl;
    }
private:
    string m_name;
    int m_age;
};

Student s1("Jeson", 18);    // 传统方式
Student s2{ "Mark", 18 };   // 初始化列表

int a1 {10};
int a2 = {10};
int * arr = new int[4]{ 0, 2, 4, 5 };

注意事项:自定义类型是尽量实现对应的构造函数,虽然初始化列表支持使用默认构造按照声明顺序进行初始化,但是从开发规范的角度来说,这种方式容易产生隐藏bug,不易排查

struct Student
{
    string m_name;
    int m_age;
};

Student s1{ "Jeson", 18 };    // 编译通过; s1.m_name == Jeson ; s1.m_age == 18
Student s2{ 18, "Jeson" };    // 编译不通过

类型安全

初始化列表可以防止"缩窄"的隐式类型转换,对于小到大的则不做限制

int a1 = 3.14;   // 编译通过
int a2 = {3.14}; // 编译不过,vs2017报错(error C2397: 从“double”转换到“int”需要收缩转换)

double b1 = 3;   // 编译通过
double b2 = {3}; // 编译通过

初始化模板类-std::initializer_list

cpp11提供了std::initializer_list模板类,可将其作为构造函数的参数,如果类有接受initializer_list作为参数的构造函数,则初始化列表语法就只能用于该构造函数。

class A
{
public:
    A(std::initializer_list<int> list) {
        cout << "A(std::initializer_list<int> list)" << endl;
    }
    A(int a, int b) {
        cout << "A(int a, int b)" << endl;
    }
};

A a1{ 1, 2 };    // A(std::initializer_list<int> list)
A a2(1, 2);      // A(int a, int b)

参考

  • 《C++ Primer Plus(第6版)中文版》

标签:初始化,name,int,age,list,列表,CPP11,Student
来源: https://www.cnblogs.com/jesonwoo/p/15893384.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有