c++中类的构造函数的初始化成员列表详解
昨天傍晚在阅读OpenCV的程序时看到代码如下:
inline Mat::Mat() : size(&rows)
{
initEmpty();
}
第一行中单冒号及其后边的内容我完全不知道是什么意思,前所未见,闻所未闻,于是查阅相关资料并询问了群里边的相关大神,最后得到的答案是冒号后边是“初始化成员列表”,于是自己上网查阅相关内容,最终搞明白了这个初始化成员列表的意思!下面就说说自己的理解!
要想理解初始化成员列表,那么首先你要搞明白构造函数的含义,构造函数说白了就是在新建类的对象时对类进行初始化的函数,它的最大特点是跟类的名称一样。更多构造函数的内容可参考资料(下载链接:百度网盘 请输入提取码 密码:xawx)第69页至70页对构造函数的介绍!
初始化成员就是针对构造函数而言的,构造函数执行时,需要初始化成员数据,有两种方式初始化成员数据。下面分别介绍:
①在构造函数的函数体中,即实现中,初始类的成员数据。例如下面的代码:
class point
{
private:int x,y;
public:point(int m=0,int n=0){x=m;y=n;}int GetX(){return x;}int GetY(){return y;}
};
②在构造函数的定义处以单冒号开始初始化成员列表(Initializer list)来初始化成员数据,比如上面例子中的构造函数 point(int m=0,int n=0)可以重写为:
point(int m=0,int n=0):x(m),y(n)
{ }
这样咋一看没有什么不同,确实,对于上面的这种简单列子来说,也真的没有太大不同。
那我们为什么要用初始化成员列表,什么时候用初始化成员列表来初始化成员数据呢?Lippman的《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表:
一,需要初始化的数据成员是对象的情况;
二,需要初始化const修饰的类成员;
三,需要初始化引用成员数据;
这里我只关注第一种情况,因为第一种情况就是昨天傍晚阅读代码时遇到的情况。
看下面的一段代码:
class point
{
protected:int m_x,m_y;
public:point(int m=0,int n=0){m_x = m;m_y = n;printf("constructor called!/n");}point(point& p){m_x = p.GetX();m_y = p.GetY();printf("copy constructor called!/n");}int GetX(){return m_x;}int GetY(){return m_y;}
};class point3d
{
private:point m_p;int m_z;
public:point3d(int i,int j, int k):m_p(i,j) // 相当于 point m_p(i,j)这样对m_p初始化{m_z=k;}void Print(){printf("%d,%d,%d /n",m_p.GetX(),m_p.GetY(),m_z);}
};
在上面的例子中,有两个类,名字分别为 point和point3d,注意在point3d类中,即代码31行定义了一个point的类的对象,名叫m_p, point3d的构造函数名叫 point3d,这个构造函数上有需要初始化的成员i,j,k,这里i,j,k不是以初始化成员列表的形式给出,但是单冒号后边的m_p是一个对象成员,所以必须用列表的形式给出,初始化成员列表实际上就是在构造函数的首行以单冒号开始的部分。
明白了以上我说的之后,再来看我昨天傍晚遇到的代码:
inline Mat::Mat() : size(&rows)
{
initEmpty();
}
很明显 Mat是Mat类的内联构造函数,它有对象成员需要实始化,以列表的形式给出,这个对象成员名字叫size,需要给的变量是&rows,具体来说这个名叫size的对角成员应该是包含在 initEmpty中的!
好了,关于的构造函数的初始化成员列表的理解分享就说到这里!以后若有新发现再补充在这个帖子中吧!
c++中类的构造函数的初始化成员列表详解相关推荐
- JavaScript数据结构与算法——列表详解(上)
列表是一组有序的数据,每个数组中的数据项称为元素.数组相关知识不够了解的伙伴可以阅读本人上篇博客在JavaScript中,列表的元素可以是任意数据类型.列表中可以保存不定数量的元素,实际使用时元素的数 ...
- JavaScript数据结构与算法——列表详解(下),基于Nodejs实现一个列表应用
1.上篇回顾: 上篇我们实现了一个列表类,并添加了一些属性,实现了比较多的方法,本文章将与大家一起使用列表实现一个图书借阅查询系统.需要使用JavaScript数据结构与算法--列表详解(上)中写好的 ...
- 路由器访问控制列表详解
路由器访问控制列表详解 路由器访问控制列表详解 网络安全保障的第一道关卡 对于许多网管员来说,配置路由器的访问控制列表是一件经常性的工作,可以说,路由器的访问控制列表是网络安全保障的第一道关卡.访问列 ...
- Python 列表详解
Python 列表详解 什么是列表 列表的定义 列表的操作 访问列表元素 列表的切片 列表的相关运算 列表常用方法 更多内容,可以微信搜索[公][众][号][ 郑大钱呀],关注我们,一起学技术! 什么 ...
- c++初始化成员列表_C++ 类构造函数初始化列表
关注我们更多精彩等你发现! 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: 上面的例子中两个构造函数的结果是一样的.上面的构造函数 ...
- C++ 初始化列表详解
目录 1.什么是初始化列表 2.什么时候需要使用初始化列表? 3.初始化列表的效率 4.初始化列表的初始化顺序 1.什么是初始化列表 class A { public:A(int value):m_d ...
- c++中的初始化列表详解
目录: 定义 使用初始化列表的原因 必须使用初始化列表的时候 成员变量的顺序 定义 与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号 ...
- C++初始化列表详解
目录: 定义 使用初始化列表的原因 必须使用初始化列表的时候 成员变量的顺序 定义 与其他函数不同,构造函数除了有名字,参数列表和函数体 ...
- [转载] Java 语言中的实例初始化块 ( IIB) 详解
参考链接: Java中的实例初始化块(IIB) 在 Java 语言中的类初始化块 文章中我们简单的介绍了下 Java 中的实例初始化块 ( IIB ).不过我觉得介绍的有点简单了,于是,再写一篇文章详 ...
最新文章
- SAXParserFactory之求解
- python实现高校教务管理系统_python实现教务管理系统
- 第 6 章 Distributed File Systems
- 如何使用ASP.NET Core Web API实现短链接服务
- 一文盘点PaddlePaddle官方九大自然语言处理模型
- vue定义对象变量并合并成新的对象
- python:threading.Thread类的使用详解
- 解决360抢票王刷票0.1秒停顿问题,思考抢票软件和IT行业
- 中国科学技术大学计算机考研好考吗,中国科学技术大学计算机考研复习方法谈...
- 清空CheckBox 勾选
- 山海演武传·黄道·第一卷 雏龙惊蛰 第二章 修闵本饰邪
- Nexus 3 Docker仓库(hosted、proxy、group)模式 讲解
- 拿森科技完成5亿元C轮融资,打造中国本土线控底盘领导者
- numpy 学习汇总18 - 数学运算 (集合,复数)( 基础学习 tcy)
- 笔试题-跳格子游戏,Java代码
- 单片机 上传服务器协议,单片机数据上传云服务器
- 【独家提供】cs1.5版CSOL人物 女性角色模型下载
- 分布式 随笔 0-分布式服务架构
- MarkDown语法学习教程,2分钟学会速写个人GitHub,轻量化,快捷,迅速,方便.
- 常见的文件类型--mime.json
热门文章
- python入门基础代码图-Python入门基础学习一
- python编程从入门到精通 叶维忠 pdf-最好的Python入门教材是哪本?
- python 贴吧自动回复机-python实现微信自动回复机器人
- 数据分析 python 用途-python数据统计分析
- python科学计算基础教程pdf下载-用Python做科学计算 pdf版
- python要在哪里写代码-如何更优雅地写python代码
- python语言入门m-Python2 教程
- JSR315(JavaTM Servlet 3.0 Specification)
- LeetCode Maximal Square(最大子矩阵)
- The Report(连接查询)