C++构造函数初始化列表的实现详解

目录
  • 1.前言
  • 2.初始化列表
  • 3.注意事项

1.前言

初始化就是给变量一个初始值。 初始化的目的是为了让变量有值,防止使用时出现异常。

在构造函数中,有一项重要功能就是对成员变量进行初始化,一般我们采用两个方法:

对成员变量赋值和采用初始化列表

2.初始化列表

在这之前我们来观察一下样例看这两者之间有什么区别:

class Date
{
public:
	Date(int year = 1900, int month = 1, int date = 1)
	{
		_year = year;
		_month = month;
		_date = date;
	}//赋值
    Date(int year = 1900, int month = 1, int date = 1)
        :_year(year)
        ,_month(month)
        ,_date(date)
        {}//初始化列表
}

显然的,初始化列表是以冒号开始,然后紧跟着的是以逗号为分隔符的数据成员列表,每个数据成员后面都有一个括号,括号中的是该成员变量的初始值或表达式。其中语句:

_year(year),_month(month),_date(date)

其实就是相当于函数体内部的:

_year = year;_month = month;_date = date;

虽然说效率上没有什么很大区别,但使书写更加方便,尤其在成员变量较多时优势更加突出

3.注意事项

1.成员变量的初始化顺序与初始化列表中列出的变量的顺序无关,它只与成员变量在类中声明的顺序有关。

如代码所示:

#include<iostream>
using namespace std;
class A
{
public:
	A(int a)
		:_a1(a)
		, _a2(_a1)
	{}
	void Print()
	{
		cout << _a1 << " " << _a2 << endl;
	}
private:
	int _a2;
	int _a1;
};
int main()
{
	A aa(1);
	aa.Print();
}

结果:

出现上面结果,是因为我们在类的声明中的顺序决定了成员变量的赋值,所以在 A类 中先让 _a2 赋值,然而 _a1还未赋值,所以_a2 的值为一个奇怪的数字。

2.一般类中我们还需要定义某些特殊成员变量,初始化 这些成员变量的唯一方法就是使用初始化列表。

如代码所示:

class B {
private:
	int& _b;
	const int _len;
	A _c;
	int* _a;
public:
	//B(int len, int b)
	//	: _len(len)
	//	,_b(b)
	//	,_c(0)
	//{
	//	_a = new int[len];
	//}
	B(int len, int b)
	{
		_len = len;
		_c = 0;
		_b = b;
		_a = new int[len];
	}
};

该代码中如果用赋值来初始化成员变量的话,会报出以下错误:

所以,当类中包含了:引用成员变量;const成员变量;自定义类型的成员变量时,必须将这些成员放在初始化列表中进行初始化。

结果:

到此这篇关于C++构造函数初始化列表的实现详解的文章就介绍到这了,更多相关C++构造函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++赋值函数+移动赋值函数+移动构造函数详解

    目录 左值引用和右值引用 左值与右值 左右值的切换 左值引用:将左值绑定在引用上 常量左值引用和非常量左值引用 右值引用:将右值绑定在引用上 常量右值引用和非常量右值引用 移动构造函数 赋值和移动赋值函数 左值引用和右值引用 左值与右值 左值:在内存中占有确定位置的对象,即左值占有内存.换句话来说,就是有地址,有值. 右值:不占内存(科学地讲是临时寄存器),仅有值,为临时变量. 左右值的切换 右值->左值:用*符号. int a=10; int* b=&a;// b为右值. *b=20;//

  • C++面向对象中构造函数使用详解

    目录 构造函数作用 构造函数特征 构造函数种类 默认构造函数 编译器合成的默认构造函数 手动定义的默认构造函数 自定义带参数的构造函数 拷贝构造函数 合成拷贝构造函数 自定义拷贝构造函数 拷贝构造函数的调用时间 赋值构造函数(operator=) 特别注意 构造函数作用 构造函数可以在创建对象的时候初始化成员数据,或者利用现有对象修改现有对象数据(赋值拷贝构造函数). 构造函数特征 自动调用,在创建对象的时候编译器自动调用 - 构造函数名和类名相同 - 构造函数没有返回值 - 可以有多个构造函数

  • C++浅析构造函数的特性

    目录 构造函数的概念 构造函数的特性 只能有一个构造函数 构造函数的概念 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期内只调用一次. 构造函数的特性 (1)函数名与类名相同. (2)无返回值. (3)编译器自动调用对应的构造函数. (4)构造函数可以重载. 我们这里直接举一个例子 #include<iostream> using namespace std; class Data { public:

  • C++类与对象深入之构造函数与析构函数详解

    目录 对象的初始化和清理 一:构造函数 1.1:构造函数的特性 1.2:构造函数的分类 二:析构函数 2.1:概念 2.2:特性 三:拷贝构造函数 3.1:概念 3.2:特性 3.3:拷贝构造函数调用时机 3.4:构造函数调用规则 对象的初始化和清理 生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全.C++中的面向对象来源于生活,每个对象也都会有初始设置以及对象销毁前的清理数据的设置. 一:构造函数 对象的初始化和清理也是两个非常重要的安全问题,一个

  • C++超详细讲解拷贝构造函数

    目录 构造函数 特征 编译器生成的拷贝构造 拷贝构造的初始化列表 显式定义拷贝构造的误区 结论 构造函数 只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用 拷贝构造函数是构造函数的一个重载,因此显式的定义了拷贝构造,那么编译器也不再默认生成构造函数. 特征 拷贝构造也是一个特殊的成员函数 特征如下: 拷贝构造是构造函数的一个重载: 拷贝构造的参数只有一个并且类型必须是该类的引用,而不是使用传值调用,否则会无限递归: 若没有显

  • C++超详细讲解构造函数

    目录 类的6个默认成员函数 构造函数 特性 编译器生成的默认构造函数 成员变量的命名风格 类的6个默认成员函数 如果我们写了一个类,这个类我们只写了成员变量没有定义成员函数,那么这个类中就没有函数了吗?并不是的,在我们定义类时即使我们没有写任何成员函数,编译器会自动生成下面6个默认成员函数. class S { public: int _a; }; 这里就来详细介绍一下构造函数. 构造函数 使用C语言,我们用结构体创建一个变量时,变量的内容都是随机值,要想要能正确的操作变量中存储的数据,我们还需

  • C++实现拷贝构造函数的方法详解

    目录 引入 一.什么是拷贝构造函数 二.什么情况下使用拷贝构造函数 三.使用拷贝构造函数需要注意什么 四.深拷贝浅拷贝 4.1 浅拷贝 4.2 深拷贝 引入 对于普通类型的对象来说,他们之间的复制很简单: int a = 10;int b = a; 但是对于类对象来说,其中会存在许多的成员变量. #include <iostream> using namespace std; class CExample { private: int a; public: //构造函数 CExample(in

  • C++构造函数初始化列表的实现详解

    目录 1.前言 2.初始化列表 3.注意事项 1.前言 初始化就是给变量一个初始值. 初始化的目的是为了让变量有值,防止使用时出现异常. 在构造函数中,有一项重要功能就是对成员变量进行初始化,一般我们采用两个方法: 对成员变量赋值和采用初始化列表 2.初始化列表 在这之前我们来观察一下样例看这两者之间有什么区别: class Date { public: Date(int year = 1900, int month = 1, int date = 1) { _year = year; _mon

  • C++中的构造函数与析造函数详解

    C++中的构造函数与析造函数详解  构造函数的概念 (1)构造函数是特殊的成员函数         (2)当创建类类型的新对象时,系统自动会调用构造函数         (3) 构造函数是为了保证对象的每个数据成员都被正确的初始化.         创建构造函数的注意事项: (1) 函数名与类名相同:         (2) 没有返回类型,返回类型也不能是void型         (3) 构造函数通常情况下声明为public,否则不能像其它成员函数那样被显示的调用         (4) 构造

  • tensorflow之变量初始化(tf.Variable)使用详解

    默认本系列的的读者已经初步熟悉tensorflow. 我们通过tf.Variable构造一个variable添加进图中,Variable()构造函数需要变量的初始值(是一个任意类型.任意形状的tensor),这个初始值指定variable的类型和形状.通过Variable()构造函数后,此variable的类型和形状固定不能修改了,但值可以用assign方法修改. 如果想修改variable的shape,可以使用一个assign op,令validate_shape=False. 通过Varia

  • vue实现列表展示示例详解

    目录 Vue 的CSS之deep语法 ::v-deep classPrefix 前缀 给元素绑定class 总结 Object.freeze 关于Vue和ts的配合问题 ISO8601和dayjs库 一. ISO8601 1. Date对象=>ISO字符串 2. ISO字符串=>Date对象 JS操作时间的库-dayjs 安装 使用 JSON.parse的返回值没有类型 Vue 的CSS之deep语法 ::v-deep 我们知道,在Vue组件的style标签里,加上scoped属性,会使写的样

  • React Native 的动态列表方案探索详解

    目录 背景 技术方案介绍 内存 异常处理 未来规划 背景 时至2022,精细化运营已经成为了各大App厂商的强需求,阿里的 DinamicX.Tangram 大家应该都很熟悉了,很多App厂商也自研了一些类似框架,基于DSL的动态化方案虽然有性能上的一些优势,但是毕竟不是图灵完备,一些需要逻辑动态下发的需求实现成本偏高,或由于DSL本身限制无法实现,针对这个问题我们使用RN进行了一下探索尝试, 利用我们已经相对完善的RN基建,结合客户端列表能力低成本的实现了一套的动态化能力,同时兼顾一定的性能体

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

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

  • linux中关于ftp查看不到文件列表的问题详解

    今天配置linux服务器的ftp后,登录都正常,使用ftp工具登录后,所有目录都可以通过手工写路径访问,但是文件夹和文件列表看不到数据. 后来分析,总结原因得出结果是跟selinux有关,于是通过关闭selinux后尝试,ftp文件夹和文件列表都正常可以查看了. 如下2张图为解决前和解决后的截图: 1.解决前,通过输入正确的路径可以正常读取访问,但是看不到列表. 2.解决后,可以可视化查看列表数据. 在Linux下设置selinux有三种方法 一.在图形界面中: 桌面-->管理-->安全级别和

  • vue数据初始化initState的实例详解

    数据初始化 Vue 实例在建立的时候会运行一系列的初始化操作,而在这些初始化操作里面,和数据绑定关联最大的是 initState. 首先,来看一下他的代码: function initState(vm) { vm._watchers = []; var opts = vm.$options; if(opts.props) { initProps(vm, opts.props); //初始化props } if(opts.methods) { initMethods(vm, opts.method

  • Vue多选列表组件深入详解

    多选列表 (Multi-Select) 是一种将所有选项列出,并允许用户利用 Ctrl/Shift 键进行多选的 UI 元素.这是一种常见的设计元素.有时候为了节省空间,我们会将选项折叠于 Combo Box 中.为了方便用户操作,这个组件还将添加 Select All 和 Clear All 两个按钮,允许用户快速选择或清除选择.这个 UI 元素曾被运用于 Correlation Plot App 中. 注册组件 注册 Multi-Select 组件,简单来说就是复制粘贴已封装好的代码部分.此

  • python切片复制列表的知识点详解

    1.不指定开始和结束的索引[:],这样得到的切片就可以包含整个列表,然后给切片一个新的变量,从而实现复制列表. 2.创建原始列表的副本,两个列表的操作不会影响. 实例 names = ["Jerry", "Tom"] names_copy = names[:] names.append("Ann") names_copy.append("Bob") print(f"names:{names}") print

随机推荐