C++构造函数初始化列表的实现详解
作者:AKA.瞳源治 发布时间:2022-05-21 09:54:10
标签:C++,构造函数,初始化列表
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成员变量;自定义类型的成员变量时,必须将这些成员放在初始化列表中进行初始化。
结果:
来源:https://blog.csdn.net/qq_64109690/article/details/126696883


猜你喜欢
- 安装jdk1.7.0_04后,同时设置环境变量,并且source。可是java -version查看后,还是只能查看到jdk1.6和jdk1
- 多线程内容大致分两部分,其一是异步操作,可通过专用,线程池,Task,Parallel,PLINQ等,而这里又涉及工作线程与IO线程;其二是
- 本文实例为大家分享了C#窗体实现酒店管理系统的具体代码,供大家参考,具体内容如下一、概述酒店管理系统是我们常说的MIS (Managemen
- 在Android开发中,有时我们需要对一个对象的集合按照某一个字段进行排序,Beanpublic class Student { priva
- 编译常见问题在开发过程中,有碰到过一些由于编译优化导致的代码修改并不符合我们预期的情况。这也就是之前为什么我经常说编译产物其实是不太可以被信
- 了解过spring-Boot这个技术的,应该知道Spring-Boot的核心配置文件application.properties,当然也可以
- 一、电子邮件详解假设自己的电子邮件是me@163.com,对方的邮件是you@163.com我们编写好文件填写好对方文件,点击发送,这些电子
- 本文实例为大家分享了Java编写实现九宫格应用的具体代码,供大家参考,具体内容如下在九宫格里面轮流画圈或叉,哪一方先在水平、竖直、或对角线上
- 简介我们在开发web应用的时候,有时候为了适应浏览器大小的调整,需要动态对页面的组件进行位置的调整。这时候就会用到flow layout,也
- 本文实例讲述了Android6.0开发中屏幕旋转原理与流程。分享给大家供大家参考,具体如下:从Android 系统开发开始,这里写下Andr
- 程序如下:View Code /* * Hanoi塔游戏 问题描述: * 汉诺塔:汉诺塔(又称河内塔)问
- 线程的同步是保证多线程安全访问竞争资源的一种手段。线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源、什么时候需要考虑同
- Java集合删除元素ArrayList实例详解AbstractCollection集合类中有一个remove方法,该方法为了适配多种不同的集
- 本文实例讲述了Android应用启动另外一个apk应用的方法。分享给大家供大家参考,具体如下:在开发的过程中,经常会遇到在一个应用中启动另外
- 概况本文主要给大家介绍了通过JDK源码学习InputStream的相关内容,JDK 给我们提供了很多实用的输入流 xxxInputStrea
- Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android
- .Net的System.Net.Sockets.TcpClient和System.Net.Sockets.Socket都没有直接为Conne
- 本文实例讲述了C#基于XNA生成随机颜色的方法。分享给大家供大家参考。具体分析如下:确保您使用的是Microsoft.Xna.Framewo
- java "equals"和"==”异同首先简单说一下“equal”和“==”==操作对于基本数据类型比较的是
- 效果展示如下所示:实时监控redis环境信息和日志列表Redis配置在windows下安装的redis,在安装目录找到redis.windo