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++初始化列表内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++实现String类的方法详解

    目录 前言 string模拟实现 string简单实现 string完整实现 完整代码 前言 在C语言中,没有专门用来表示字符串的类型.C语言的字符串是一系列以’\0’为结尾的字符的集合.虽然C语言为这样的字符串提供了一系列的库函数如strcpy, strcmp等等,但这些函数与字符串这个类型是分开的,这不太符合C++中面试对象的思想,所以在C++中封装了一个string类,来帮助我们操作字符串.string该如何使用,我这里就不做赘述了,大家可以去看看官方文档呀 string - C++ Re

  • C++中的数字转字符串to_string

    目录 C++数字转字符串to_string C++转换为字符串(to_string:to_wstring) 一.to_string 二.to_wstring C++数字转字符串to_string 有时候我们在编程的时候,需要将数字转换成字符串,c++ string 中有个方便的函数,就是to_string. 例子: #include <iostream>    #include <string>      using namespace std; int main() {    

  • 一文带你分清C++的定义,声明和初始化

    目录 定义 初始化 声明 实例 声明时提供初值 在构造函数内赋初值,而不用列表 总结 定义 变量的定义用于为变量分配存储空间,还可以为变量指定初始值. int units_sold; double sales_price, avg_price; std::string title; Sales_item curr_book; // class Sales_item 初始化 C++ 支持两种初始化变量的形式:复制初始化和直接初始化.复制初始化语法用等号(=),直接初始化则是把初始化式放在括号中.

  • C++11系列学习之列表初始化

    目录 前言: 旧标准初始化方式 C++11标准初始化方式 初始化列表技术细节 总结 前言: 由于旧标准初始化方式太过繁杂,限制偏多,因此在新标准中统一了初始化方式,为了让初始化具有确定的效果,于是提出了列表初始化概念. 旧标准初始化方式 普通数组初始化: int i_arr[3] = {1, 2, 3} POD类型初始化(即plain old data类型,可以直接使用memcpy复制的对象): struct A { int x; struct B { int i; int j; } b; }

  • C++中String类型的逆序方式

    目录 C++String类型的逆序 这里使用反向迭代器实现 用String方法逆序输出字符串数组 方法 C++String类型的逆序 这里使用反向迭代器实现 #include<iostream> #include <string> using namespace std; int main() { string str; cin>>str; string s(str.rbegin(),str.rend()); cout << s <<endl;

  • C++定义和初始化string对象实例详解

    目录 正文 定义string 初始化string 全面初始化 默认初始化 拷贝初始化 直接初始化 正文 在c++当中,标准类型string来代表可变长的字符串序列,使用string需要加载string 头文件,而方法定义在命名空间std当中,所以使用的基本结构: #include <string> int main(){ using std::string; string str1 = "hello world"; return 0; } 当然也可以结合之前的输入输出部分:

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

    目录 定义 特性 初始化阶段 计算阶段 成员变量的初始化顺序 定义 我们先来看一个例子 Date(int year, int month, int day)//带参构造函数 :_year(year) , _month(month) , _day(day) {} 这是一个简单的初始化列表案例,以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括 号中的初始值或表达式. 特性 A.初始化列表能只能初始化一次,多次初始化会报错 Date(int year =

  • C++深入讲解初始化列表的用法

    目录 一.小问题 二.类成员的初始化 三.类中的 const 成员 四.初始化与赋值的不同 五.小结 一.小问题 下面的类定义是否合法? 如果合法,ci 的值是什么,存储在哪里? 下面编写代码一探究竟(代码1): #include <stdio.h> class Test { private: const int ci; public: Test() { ci = 10; } int getCI() { return ci; } }; int main() { Test t; printf(&

  • Spring示例讲解条件注入方法

    目录 简介 @Component+条件注解 @Configuration+@Bean+条件注解 @Configuration+条件注解+@Bean 自定义Condition 简介 说明 本文用实例介绍Spring的条件注入的用法. @Component.@Configuration+@Bean都可以与条件注入的注解结合. @Component+条件注解 Bean package com.example.config; import org.springframework.boot.autocon

  • C语言示例讲解结构体的声明与初始化方法

    目录 一.结构体声明的结构 1.直接声明 2.使用typedef声明一个新的类型 3.不完全声明 二.结构体初始化 1.声明(同时定义)时直接赋值 2.定义时直接赋值 3.定义后赋值 4.指定初始化 一.结构体声明的结构 1.直接声明 struct tag { member-list: member-list: member-list: ... } variable-list; tag 是结构体类型的标签. member-list 结构体的元素定义,比如 int i; 或者 float f,或者

  • C++11中初始化列表initializer lists的使用方法

    C++11引入了初始化列表来初始化变量和对象.自定义类型,如果想用初始化列表就要包含initializer_list头文件. C++11将使用大括号的初始化(列表初始化)作为一种通用初始化方式,可用于所有类型.初始化列表不会进行隐式转换. C++11提供的新类型,定义在<initializer_list>头文件中. template< class T > class initializer_list; 先说它的用处吧,然后再详细介绍一下. 首先有了initializer_list之

  • 从PySpark中的字符串获取列表方法讲解

    在 PySpark 中是否有类似eval的功能. 我正在尝试将 Python 代码转换为 PySpark 我正在查询一个数据框,并且其中一列具有数据,如下所示,但采用字符串格式. [{u'date': u'2015-02-08', u'by': u'abc@gg.com', u'value': u'NA'}, {u'date': u'2016-02-08', u'by': u'dfg@yaa.com', u'value': u'applicable'}, {u'date': u'2017-02-

  • JS字符串分割方法整理汇总示例讲解(3种截取方法和6个辅助方法)

    目录 一.使用 slice() 截取 1,函数说明 2,使用样例 二.使用 substring() 截取 1.函数说明 2.使用样例 三.使用 substr() 截取 1.函数说明 2.使用样例 附:其他一些常用的方法 1.indexOf() 2,lastIndexOf() 3,split() 4,join() 5,concat() 6,charAt() JavaScript在开发中常常会需要截取字符串,而JS提供了slice() .substring().substr() 3种方法实现截取操作

  • Python3学习笔记之列表方法示例详解

    前言 本文主要给大家介绍了关于Python3列表方法的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 1 使用[]或者list()创建列表 user = [] user = list() 2 使用list() 可以将其他类型转换成列表 # 将字符串转成列表 >>> list('abcde') ['a', 'b', 'c', 'd', 'e'] # 将元祖转成列表 >>> list(('a','b','c')) ['a', 'b', 'c']

  • C++使用初始化列表的方式来初始化字段的方法

    几个月之前,接触Android recovery源代码的时候,看ScreenRecoveryUI类的时候,那时候C++基础还不是特别好,一直不明白以下的初始化方式: 下面这个是Recovery的一个构造函数,代码位于:screen_ui.cpp,它的类的实现在screen_ui.h. 如下这个ScreenRecoveryUI类,这个类是继承于RecoveryUI类的: 这个文件在screen_ui.h class ScreenRecoveryUI : public RecoveryUI { pu

  • Python使用draw类绘制图形示例讲解

    目录 视频 Pygame模块之pygame.draw 示例1 示例2 视频 观看视频 Pygame模块之pygame.draw 本文将主要介绍Pygame的draw模块,主要内容翻译自pygame的官方文档 pygame.draw 模块用于在Surface上绘制一些简单的图形,比如点.直线.矩形.圆.弧等. pygame.draw中函数的第一个参数总是一个surface,然后是颜色,再后会是一系列的坐标等.稍有些计算机绘图经验的人就会知道,计算机里的坐标,(0,0)代表左上角.而返回值是一个Re

随机推荐