学习C++(7)初始化列表+隐式类型转换

目录

1.初始化列表

(1)初始化列表的概念

(2)成员变量走初始化列表的逻辑

2.隐式类型转换

1.初始化列表

(1)初始化列表的概念

在前面的文章实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有一种方式,就是初始化列表,初始化列表的使用方式是以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式:

cpp 复制代码
class Time
{
public:
    Time(int hour)
    :_hour(hour)
    {
        
    }
private:
    int _hour;
};

class Date
{
public:
    Date(int& x, int year = 1, int month = 1, int day = 1)
    :_year(year)
    ,_month(month)
    ,_day(day)
    ,_t(12)
    ,_ref(x)
    ,_n(1)
    {
 
    }
    void Print() const
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
private:
    int _year;
    int _month;
    int _day;
    Time _t;          
    int& _ref;          
    const int _n;  
};
int main()
{
    int i = 0;
    Date d1(i);
    d1.Print();
    return 0;
}

每个成员变量在初始化列表中只能出现一次,语法理解上初始化列表可以认为是每个成员变量定义 初始化的地方。

(2)成员变量走初始化列表的逻辑

另外,初始化列表还有一些要注意的点:

①初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的的先后顺序无关,建议声明顺序和初始化列表顺序保持一致。

②无论是否显式写初始化列表,每个构造函数都有初始化列表。

③无论是否在初始化列表显式初始化成员变量,每个成员变量都要走初始化列表初始化,所以尽量使用初始化列表初始化。

下面看一道例题:

下面程序的运行结果是什么()

A. 输出1 1

B. 输出2 2

C. 编译报错

D. 输出1 随机值

E. 输出1 2

F. 输出2 1

cpp 复制代码
#include<iostream>
using namespace std;
class A
{
public:
    A(int a)
        :_a1(a)
        ,_a2(_a1)
    {}
    void Print()
    {
    cout << _a1 << " " << _a2 << endl;
    }
private:
    int _a2 = 2;
    int _a1 = 2;
};

int main()
{
    A aa(1);
    aa.Print();
}

既然在初始化列表显式初始化了成员变量,那成员变量声明处加的缺省值就可以直接忽略。初始化列表中按照成员变量在类中声明顺序进行初始化,所以先初始化的是_a2,此时_a1还没有被初始化,故是随机值,_a2被赋为随机值,再初始化_a1,_a1用传递的参数初始化,被初始化为1。故这道题选D

2.隐式类型转换

C++支持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数。

cpp 复制代码
#include<iostream>
using namespace std;
class A
{
public:
    A(int a1)
    :_a1(a1)
    {}
private:
    int _a1 = 1;
};
int main()
{
     A aa1 = 1;
     aa1.Print();
}

这里的隐式转换是用1去构造临时对象,再用临时对象拷贝构造aa1,但编译器优化后会直接构造,即使类里写了拷贝构造函数,也会用直接构造函数。

const A& aa2 = 1;

这个语句不能不加const,因为1构造临时对象,临时对象具有常性,必须加const;

相关推荐
程序猿乐锅1 小时前
【Tilas|第三篇】多表SQL语句
数据库·经验分享·笔记·学习·mysql
徐某人..1 小时前
基于i.MX6ULL平台的智能网关系统开发
arm开发·c++·单片机·qt·物联网·学习·arm
AOwhisky1 小时前
Kubernetes 学习笔记:集群管理、命名空间与 Pod 基础
linux·运维·笔记·学习·云原生·kubernetes
光影少年2 小时前
大屏页面,一次多个请求,请求加密导致 点击 全局时间选择器 时出现卡顿咋解决(面板收起会延迟1~2秒)
前端·javascript·vue.js·学习·前端框架·echarts·reactjs
sakiko_3 小时前
UIKit学习笔记2-组件嵌套、滚动视图等
笔记·学习·objective-c·swift·uikit
知识分享小能手3 小时前
R语言入门学习教程,从入门到精通,R语言类别比较数据可视化- 完整知识点与案例代码(4)
学习·信息可视化·r语言
蛋白界小百灵4 小时前
纳米抗体技术全解析:从文库构建到亲和力成熟的关键策略
经验分享·科技·学习·健康医疗·业界资讯·卡梅德生物
我是发哥哈4 小时前
主流AI框架生产环境性能对比:5大关键维度深度评测
大数据·人工智能·学习·机器学习·ai·chatgpt·ai-native
nashane4 小时前
HarmonyOS 6学习:RCP远场通信流式返回实战——告别“一次性”数据阻塞
学习·华为·harmonyos
for_ever_love__4 小时前
UI学习:UITableView的基本操作及折叠cell
学习·ui·ios