目录

前言

一、什么是初始化列表

二、为什么要有初始化列表?

三、怎么使用初始化列表?

前言

我们今天要解决三个问题:什么是初始化列表?为什么要有初始化列表?怎么用初始化列表?

一、什么是初始化列表

初始化列表是一种初始化类的成员变量的方式,用于构造函数中。

二、为什么要有初始化列表?

class Time
{private:int _hour;
};class date
{
public:private:int _hour;Time _t;
};int main()
{date d1;return 0;
}

对于这样的一段简单代码,相信大家都能够看得懂,由于我们没有给两个类定义构造函数,因此两个类都会使用系统的默认构造函数。因此不会报错。

如果我们把代码稍作修改的话,大家再看看。

class Time
{
public:Time(int hour){_hour =hour;}
private:int _hour;
};class date
{
public:private:int _hour;Time _t;
};int main()
{date d1;return 0;
}

我对Time类的构造函数进行了修改,不再使用系统提供的默认构造函数。

此时的构造函数是一个有参构造,也就是需要我们进行传参的。

但是date类里面的成员函数 _t 并没有传参,因此编译器会报错。

如何解决这个问题呢?

答案是通过初始化列表进行修改。可能有的同学会问,为什么不给Time类里的构造函数定义为全缺省的函数呢?

我们可以这样想,如果Time类里面给一个全缺省的参数,那么我们调用date类的时候,是不会对里面进行传参的。那么每次都会使用全缺省的那个值,这样的话达不到我们想要的效果。

三、怎么使用初始化列表?

先说用法:

class A
{public:A():a(参数)
public:int a;
}

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

以刚刚的date类和Time进行改造。

class Time
{
public:Time(int hour = 0){_hour = hour;}
private:int _hour;
};class date
{
public:date(int hour = 0):_hour(hour),_t(hour){}
private:int _hour;Time _t;
};

注意:

1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)

2.类中包含以下成员,必须放在初始化列表位置进行初始化:

引用成员,const成员变量,自定义类型成员(且该类没有默认构造函数时)

class A
{
public:
A(int a)
:_a(a)
{}
private:
int _a;
};
class B
{
public:
B(int a, int ref):_aobj(a),_ref(ref),_n(10)
{}
private:
A _aobj; // 没有默认构造函数
int& _ref; // 引用
const int _n; // const
};

3.尽量使用初始化列表进行初始化。对于自定义类型成员变量,一定会先使用初始化列表初始化。

4. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关

举个例子:

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();
}

输出结果会是什么呢?

答案是 1,随机值。

原因:在声明的时候,是先声明的_a2,再声明的_a1,因此在初始化列表进行初始化的时候,会先初始化_a2,再初始化_a1.而给_a2传的值是_a1,此时的_a1是随机值,再给_a1赋值为1.

因此,_a1的值为1,_a2的值为随机值。

C++类 ——初始化列表相关推荐

  1. 派生类参数初始化列表和基类构造函数顺序

    今天被问到了一个问题,随便回了一句,父类还没有构建,怎么能初始化父类的成员. 派生类构造函数的参数初始化列表,为什么不能初始化基类的成员? 例如下面的是不可以的 class Rectangle : p ...

  2. C++ 类构造函数初始化列表介绍

    构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式. 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个 ...

  3. C++类构造函数初始化列表

    构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample { public:     int a;     f ...

  4. 【Flutter】Dart 面向对象 ( 类定义 | 类的继承 | 私有变量 | 可选参数 | 默认参数 | 初始化列表 )

    文章目录 一. Dart 面向对象 二. 类定义 三. 类的继承 四. 私有变量 五. 可选参数与默认参数 六. 初始化列表 七. 完整代码示例 八. 相关资源 一. Dart 面向对象 OOP 基本 ...

  5. 初始化列表||类对象作为类成员|| 静态成员

    初始化列表 作用: C++提供了初始化列表语法,用来初始化属性 语法:构造函数():属性1(值1),属性2(值2)... {} #include <iostream> using name ...

  6. 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)

    黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...

  7. 1.c++中初始化列表和构造函数初始化的区别是什么?2.类的成员变量的初始化顺序是按照声明顺序吗?

    初始化列表和构造函数初始化的区别是什么? 初始化和赋值对内置类型的成员没有太大的区别,在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的.只有一些需要注意的事项 初始化列表一般情况如下: D ...

  8. C++类构造函数初始化列表及初始化成员变量的误区

    构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: [cpp] view plaincopy class CExample { pub ...

  9. c++初始化成员列表_C++ 类构造函数初始化列表

    关注我们更多精彩等你发现! 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: 上面的例子中两个构造函数的结果是一样的.上面的构造函数 ...

最新文章

  1. 釜底抽薪:掌控能源成本,根治企业能源损耗
  2. 学习笔记Flink(三)—— Flink安装启动与监控
  3. LFS安装过程记录(1)-准备工作
  4. PHP之wampserver修改根目录与默认页面
  5. jQuery知识(转)
  6. 语言密码加密变星号_为什么汉字不能设成密码,你想过吗?
  7. vue cli3--创建通用模版
  8. hibernate使用sql进行查询
  9. JAVA常见设计模式面试题
  10. putty中文版 v0.61中文绿色软件
  11. 堆密度测定的意义_堆密度的意义是什么 汇美科LABULK 0335
  12. win10计算机域填写,win10如何加入域_windows10域如何创建
  13. 陈顼oracle,一次视图合并引起的性能问题
  14. 一个程序员的个人感悟
  15. 基于python开发植物大战僵尸
  16. 【Python】伪距单点定位
  17. 汇编语言_使用int16h中断读取键盘缓冲区
  18. 轻松解决 Eclipse Indigo 3.7 中文字体偏小,完美 Consolas 微软雅黑混合字体!
  19. 在ArcGIS中勾绘全流域方法
  20. python自动产品分类_商品自动分类的贝叶斯方法及Python实现

热门文章

  1. 服务器端跳转与客户端跳转
  2. tensorflow按位乘法_使用tensorflow实现两个一位数组的张量相加,分别是a=[1.0,2.0]和b=[3.0,4.0],打印输出结果,提交截图_学小易找答案...
  3. vs用c语言mci播放失败,C#使用mci播放MP3格式音乐文件解决方案
  4. 相对和绝对路径、创建和删除目录及文件
  5. WebGL入门(一)-初识WebGL
  6. 什么是WebGL,它有什么优点
  7. 【读书笔记】学编程学化学学开车
  8. 4、VI/VIM编辑器
  9. Delft3D水动力-富营养化模型
  10. 每日英语——大老师のaphorism