C++类 ——初始化列表
目录
前言
一、什么是初始化列表
二、为什么要有初始化列表?
三、怎么使用初始化列表?
前言
我们今天要解决三个问题:什么是初始化列表?为什么要有初始化列表?怎么用初始化列表?
一、什么是初始化列表
初始化列表是一种初始化类的成员变量的方式,用于构造函数中。
二、为什么要有初始化列表?
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++类 ——初始化列表相关推荐
- 派生类参数初始化列表和基类构造函数顺序
今天被问到了一个问题,随便回了一句,父类还没有构建,怎么能初始化父类的成员. 派生类构造函数的参数初始化列表,为什么不能初始化基类的成员? 例如下面的是不可以的 class Rectangle : p ...
- C++ 类构造函数初始化列表介绍
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式. 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个 ...
- C++类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample { public: int a; f ...
- 【Flutter】Dart 面向对象 ( 类定义 | 类的继承 | 私有变量 | 可选参数 | 默认参数 | 初始化列表 )
文章目录 一. Dart 面向对象 二. 类定义 三. 类的继承 四. 私有变量 五. 可选参数与默认参数 六. 初始化列表 七. 完整代码示例 八. 相关资源 一. Dart 面向对象 OOP 基本 ...
- 初始化列表||类对象作为类成员|| 静态成员
初始化列表 作用: C++提供了初始化列表语法,用来初始化属性 语法:构造函数():属性1(值1),属性2(值2)... {} #include <iostream> using name ...
- 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)
黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...
- 1.c++中初始化列表和构造函数初始化的区别是什么?2.类的成员变量的初始化顺序是按照声明顺序吗?
初始化列表和构造函数初始化的区别是什么? 初始化和赋值对内置类型的成员没有太大的区别,在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的.只有一些需要注意的事项 初始化列表一般情况如下: D ...
- C++类构造函数初始化列表及初始化成员变量的误区
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: [cpp] view plaincopy class CExample { pub ...
- c++初始化成员列表_C++ 类构造函数初始化列表
关注我们更多精彩等你发现! 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: 上面的例子中两个构造函数的结果是一样的.上面的构造函数 ...
最新文章
- 釜底抽薪:掌控能源成本,根治企业能源损耗
- 学习笔记Flink(三)—— Flink安装启动与监控
- LFS安装过程记录(1)-准备工作
- PHP之wampserver修改根目录与默认页面
- jQuery知识(转)
- 语言密码加密变星号_为什么汉字不能设成密码,你想过吗?
- vue cli3--创建通用模版
- hibernate使用sql进行查询
- JAVA常见设计模式面试题
- putty中文版 v0.61中文绿色软件
- 堆密度测定的意义_堆密度的意义是什么 汇美科LABULK 0335
- win10计算机域填写,win10如何加入域_windows10域如何创建
- 陈顼oracle,一次视图合并引起的性能问题
- 一个程序员的个人感悟
- 基于python开发植物大战僵尸
- 【Python】伪距单点定位
- 汇编语言_使用int16h中断读取键盘缓冲区
- 轻松解决 Eclipse Indigo 3.7 中文字体偏小,完美 Consolas 微软雅黑混合字体!
- 在ArcGIS中勾绘全流域方法
- python自动产品分类_商品自动分类的贝叶斯方法及Python实现
热门文章
- 服务器端跳转与客户端跳转
- tensorflow按位乘法_使用tensorflow实现两个一位数组的张量相加,分别是a=[1.0,2.0]和b=[3.0,4.0],打印输出结果,提交截图_学小易找答案...
- vs用c语言mci播放失败,C#使用mci播放MP3格式音乐文件解决方案
- 相对和绝对路径、创建和删除目录及文件
- WebGL入门(一)-初识WebGL
- 什么是WebGL,它有什么优点
- 【读书笔记】学编程学化学学开车
- 4、VI/VIM编辑器
- Delft3D水动力-富营养化模型
- 每日英语——大老师のaphorism