C++示例讲解初始化列表方法

 更新时间:2022年07月07日 10:41:32   作者:幻荼  
这篇文章主要介绍了C++成员初始化列表,除了可以使用构造函数对类成员进行初始化之外,C++还提供了另外一种初始化的方法,叫做成员初始化列表。下面来看看文章的详细吧,需要的朋友可以参考一下

定义

我们先来看一个例子

Date(int year, int month, int day)//带参构造函数
        :_year(year)
        , _month(month)
        , _day(day)
    {}

这是一个简单的初始化列表案例,以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括 号中的初始值或表达式。

特性

A.初始化列表能只能初始化一次,多次初始化会报错

Date(int year = 2022, int month = 4, int day = 19)//这是一般的构造函数
	{
		_year = year;
		_month = month;
		_day = day;
        _day = day;//这里_day初始化了两次,编译器会报错,每个成员只能初始化一次
	}

B.编译器也允许构造函数赋初值和初始化列表初始化混用

Date(int year = 2022, int month = 4, int day = 19)//二者不冲突
		: _year(year) //初始化
		, _month(month)
	{
		_day = day;//注意这里和上面也不能两次重复出现,如_year(year)。这样就重复了,初始化只能出现一次
	}

C.const成员变量、引用成员变量、没有默认构造函数的自定义类型成员只能在初始化列表初始化。

Date(int year = 2022, int month = 4, int day = 19)
		: _year(year) 
		, _month(month)
		, _n(2) //const成员变量必须使用初始化列表进行初始化
	{
		_day = day;
		//_n = 2; //const成员变量不能在函数体内初始化
	}
Date(int year = 2022, int month = 4, int day = 19)
		: _year(year) 
		, _month(month)
		,_ref(year)//引用成员变量要在初始化列表初始化
	{
		_day = day;
		//_ref = year; //引用成员变量不能在函数体内初始化
	}
Date(int year = 2022, int month = 4, int day = 19)
		: _year(year) 
		, _month(month)
		, _a(20)//没有默认构造函数的自定义类型成员变量必须在初始化列表进行初始化
	{
		_day = day;
	}

const成员变量、引用成员变量、没有默认构造函数的自定义类型成员变量必须在初始化列表内初始化的原因:

1.初始化列表是对象的成员变量定义的地方。

2.对象的内置类型成员变量在初始化列表定义时没有要求必须初始化,因此既可以在初始化列表进行初始化,也可以在构造函数体内初始化。

3.const成员变量、引用成员变量、没有默认构造函数的自定义类型成员变量不能先定义再初始化,它们在初始化列表内定义,并且必须在定义时就初始化,因此必须在初始化列表内初始化。

同时构造函数的执行可以分成两个阶段,初始化阶段和计算阶段,初始化阶段先于计算阶段。

初始化阶段

所有类类型(class type)的成员都会在初始化阶段初始化,即使该成员没有出现在构造函数的初始化列表中。

计算阶段

一般用于执行构造函数体内的赋值操作。

成员变量的初始化顺序

class Date
{
public:
    Date(int year, int month, int day)//初始化是根据定义的先后顺序,如year第一个定义,就第一个初始化
        :_month(month)//第二个初始化
        , _year(year) //第一个初始化
        , _day(day)   //第三个初始化
    {}
private:
    int _year; //第一个定义
    int _month;//第二个定义
    int _day;  //第三个定义
};

到此这篇关于C++示例讲解初始化列表方法的文章就介绍到这了,更多相关C++初始化列表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现LeetCode(63.不同的路径之二)

    C++实现LeetCode(63.不同的路径之二)

    这篇文章主要介绍了C++实现LeetCode(63.不同的路径之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 初学C++之自定义类型名简化详解

    初学C++之自定义类型名简化详解

    下面小编就为就大家带来一篇初学C++之自定义类型名简化详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • Opencv实现画笔功能

    Opencv实现画笔功能

    这篇文章主要为大家详细介绍了Opencv实现画笔功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • C++ move()函数及priority_queue队列使用记录

    C++ move()函数及priority_queue队列使用记录

    move(obj)函数的功能是把obj当做右值处理,可以应用在对象的移动上,这篇文章主要介绍了C++ move()函数及priority_queue队列使用记录,需要的朋友可以参考下
    2023-01-01
  • C语言详解如何应用模拟字符串和内存函数

    C语言详解如何应用模拟字符串和内存函数

    这篇文章主要介绍了C语言详解如何应用模拟字符串和内存函数,文章有点长,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • C++ Boost Foreach超详细分析讲解

    C++ Boost Foreach超详细分析讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • linux下C/C++学生信息管理系统

    linux下C/C++学生信息管理系统

    这篇文章主要为大家详细介绍了linux下c/c++学生信息管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C++数据结构关于栈迷宫求解示例

    C++数据结构关于栈迷宫求解示例

    这篇文章主要为大家介绍了C++数据结构关于栈的迷宫求解示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-11-11
  • 基于堆的基本操作的介绍

    基于堆的基本操作的介绍

    本篇文章对堆的基本操作进行了详细的分析介绍。需要的朋友参考下
    2013-05-05
  • C++的new和delete详解

    C++的new和delete详解

    这篇文章主要介绍的是C++的new和delete,可以这么理解 new相当于是malloc 、delete相当于是free,下面我们就来详情介绍,,需要的朋友可以参一考
    2021-09-09

最新评论