【C++】构造函数初始化列表

2023-10-26

目录

一.为什么要用构造函数初始化列表

二.使用构造函数初始化列表的方式

三.构造函数成员初始化顺序


一.为什么要用构造函数初始化列表

常规的构造函数初始化方式

class Rectangle
{
public:
    Rectangle(int width,int height)
    {
        m_width = width;
        m_height = height;
    }
};

在类外定义构造函数要指明该构造函数是哪个类的成员

class Rectangle
{
  //do something
};
//类外定义类的构造函数
Rectangle::Rectangle()
{
  //init something
}

但是,如果成员是const,引用,或者属于某种未提供默认构造函数的类,则必须通过构造函数初始化列表为这些成员提供初值,否则会报错。

 这里成员a并没有报错,默认初始化,而b为const类型,c为引用类型,都会报未提供初始值错误

二.使用构造函数初始化列表的方式

ClassName(parameterList):dataField1{value1},dataField2{value2}
{
    //something to do
}

构造函数初始化列表是在构造函数的基础上,在参数和函数体花括号之间,以一个冒号开始,插入的内容就是初始化列表。此处采用了C++11的列表初始化的方式插入,还可以使用dataField1(value1)这样的方式插入。

上面的构造函数使用初始化列表方式代码如下:

#include <iostream>
using namespace std;
class Rectangle
{
public:
	Rectangle(); //默认构造函数
	Rectangle(int val) :a(val), b(val), c(a){}; //构造函数初始化列表
	void show()
	{
		cout << a << endl;
		cout << b << endl;
		cout << c << endl;
	}
private:
	int a;
	const int b;
	int &c;
};
int main()
{
	Rectangle rectangle(1);
	rectangle.show();
	system("pause");
	return 0;
}

或者: 

class Rectangle
{
public:
	Rectangle() :a(1), b(1), c(a){}; //构造函数初始化列表
	void show()
	{
		cout << a << endl;
		cout << b << endl;
		cout << c << endl;
	}
private:
	int a;
	const int b;
	int &c;
};
int main()
{
	Rectangle rectangle;
	rectangle.show();
	system("pause");
	return 0;
}

对象数据类型必须在构造函数体之前初始化 

这里具体是指Add对象的构造函数必须在Rectangle的构造函数体之前完成初始化                      

class Add
{
    //do something
}
class Rectangle
{
public:
	Rectangle();  //默认构造函数
    /*
    Rectangle()
    {
      add = Add(); //这样做就不能保证add构造函数在Rectangle函数体之前完成初始化
    };
    */
    Rectangle():add()
    {
      //do something 
    };  //类对象构造函数初始化列表
private:
    Add add;
};
int main()
{
	Rectangle rectangle;
}

三.构造函数成员初始化顺序

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

但是,如果一个成员是用另一个成员来初始化的,那么这两个成员的初始化顺序就很关键了;

class A
{
public:
  A(int val):b(val),a(b){} //实际上的顺序是a先初始化,所以报错:试图用未定义的b初始化a
private:  
  int a;
  int b;
}

最好建议使用构造函数的参数作为成员的初始值

class A
{
public:
  A(int val):b(val),a(val){} //实际上的顺序是a先初始化,所以报错:试图用未定义的b初始化a
private:  
  int a;
  int b;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++】构造函数初始化列表 的相关文章

随机推荐

  • gp 索引列表查询,表字段类型,字段注释查询

    所有索引列表 SELECT n nspname as Schema c relname as Name c2 relname as Table FROM pg catalog pg class c JOIN pg catalog pg ro
  • 解决v-for轮播图中图片无法显示

    v fo中src拿不到img的地址 图片无法显示 view可以打印出list data中的img值 说明数组没问题 已经拿到图片值 将src直接赋值地址 有图片显示 那么就是src没有拿到图片地址 网页元素检查中也发现 这里的图片img中没
  • 无盘服务器2018,2018无盘服务器配置

    2018无盘服务器配置 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 源端服务器数据收集声明 源端服务器上安装和配置完迁
  • Nerd Font 字体安装

    一 Nerd Font 是什么 Nerd Font 是为开发人员准备的 具有大量字形 图标 的字体 特别是从流行的 标志性字体 中添加大量额外的字形 如Font Awesome Devicons Octicons等 二 安装步骤 1 克隆仓
  • React 下 message组件属性设置

    式子 message info content React ReactNode duration number gt void onClose configonClose 例子 message info 提示内容 自动关闭的延时 单位秒 设
  • MATLAB实现PSO-DBN算法优化深度置信网络的多输入单输出回归预测

    MATLAB实现PSO DBN算法优化深度置信网络的多输入单输出回归预测 随着数据分析和机器学习技术的不断发展 深度学习作为一种强大的分析工具广泛应用于各个领域 在时间序列预测领域中 深度置信网络 Deep Belief Network D
  • c/c++基础(二十三) GDB调试入门

    用GDB调试程序 GDB概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具 或许 各位比较喜欢那种图形界面方式的 像VC BCB等IDE的调试 但如果你是在UNIX平台下做软件 你会发现GDB这个调试工具有比VC BCB的
  • Testing ovn manually based on LXD (by quqi99)

    作者 张华 发表于 2022 05 27 版权声明 可以任意转载 转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 准备两个LXD容器 lxc list NAME STATE IPV4 IPV6 TYPE SNAPSHOTS
  • 通过 Git 将代码提交到 GitHub

    通过 Git 将代码提交到 GitHub 文章目录 通过 Git 将代码提交到 GitHub 第一种 本地没有 Git 仓库 clone GitHub 上已有的仓库 第二种 将本地普通仓库变成 Git 仓库 并推送到 GitHub 第三种
  • Win7 计算机中丢失api-ms-win-core-path-

    背景 win7安装软件时提示 无法启动此程序 因为计算机中丢失api ms win core path 1 1 0 dll 问题原因 缺少api ms win core path 1 1 0 dll 解决方式 下载dll并放到指定路径 下载
  • 第十二章 演员评论家(Actor-Critic)-强化学习理论学习与代码实现(强化学习导论第二版)

    获取更多资讯 赶快关注上面的公众号吧 强化学习系列 第一章 强化学习及OpenAI Gym介绍 强化学习理论学习与代码实现 强化学习导论第二版 第二章 马尔科夫决策过程和贝尔曼等式 强化学习理论学习与代码实现 强化学习导论第二版 第三章 动
  • asp 打开服务器文件夹,什么是ASP?如何打开ASP文件

    ASP是基于WEB的一种编程技术 可以说是CGI的一种 它可以完成以往CGI程序的所有功能 如计数器 留言簿 公告板 聊天室等等 ASP可以轻松地实现对页面内容的动态控制 根据不同的浏览者 显示不同的页面内容 而浏览者一点觉察不出来 就像为
  • ROS配置DMZ?防火墙教程-ros配置DMZ

    简单的说 当我们内网服务器的所有端口都需要开放到外网的时候 我们需要使用DMZ功能 本文将演示如何将内网IP10 10 10 2的所有端口映射 开放到公网 DMZ是英文 demilitarized zone 的缩写 中文名称为 隔离区 也称
  • Android NestedScrollView嵌套RecyclerView滑动卡顿问题终极解决方案

    如果是如下的页面布局 NestedScrollView嵌套RecyclerView 随着recyclerVIew的加载 item越多 会发现滑动卡顿 大致解决方案有以下两种 方案1 取消recyclerVIew的滑动 mRecyclerVi
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 【深度学习】 Python 和 NumPy 系列教程(二十):Matplotlib详解:2、3d绘图类型(6)3D向量场图(3D Vector Field Plot)

    目录 一 前言 二 实验环境 三 Matplotlib详解 1 2d绘图类型 2 3d绘图类型 0 设置中文字体 1 3D线框图 3D Line Plot 2 3D散点图 3D Scatter Plot 3 3D条形图 3D Bar Plo
  • 两个分数化简比怎么化_小学数学“比的化简和求比值”

    小学数学第十一册中比的化简和要比值 有些小学生觉得有点难 我觉得这部分知识主要是学生还没有掌握以下方法 一 比的化简几种类型 1 比的前项和比的后项都是整数 例 5 25 5 25 1 5 1 5 就是用比的前项除以比的后项 可写成分数的形
  • Java 零基础教程,看完就会,建议收藏

    如果你不懂Java 并且想认真学习接触了解一下Java的语法 建议把这篇文章收藏了 多看几遍 应该可以初步掌握Java 大部分基础的语法 让我们出发吧 ps 本文有点长 耐心阅读 编程环境 工程项目推荐使用IDEA 入门学习推荐使用jupy
  • Redis在Springboot中的使用——Hash

    Redis在Springboot中的使用 Hash 数据类型详解 操作命令 添加 获取 修改 删除 其他操作 使用 应用场景 购物车 用户个人详情 商品详情 数据类型详解 在讲解Redis中Hash的使用之前 大家需要知道Hash是怎么样的
  • 【C++】构造函数初始化列表

    目录 一 为什么要用构造函数初始化列表 二 使用构造函数初始化列表的方式 三 构造函数成员初始化顺序 一 为什么要用构造函数初始化列表 常规的构造函数初始化方式 class Rectangle public Rectangle int wi