c++中类的构造函数的初始化成员列表详解!
来源:互联网 发布:录制cf视频软件 编辑:程序博客网 时间:2024/05/21 17:30
昨天傍晚在阅读OpenCV的程序时看到代码如下:
inline Mat::Mat() : size(&rows)
{
initEmpty();
}
第一行中单冒号及其后边的内容我完全不知道是什么意思,前所未见,闻所未闻,于是查阅相关资料并询问了群里边的相关大神,最后得到的答案是冒号后边是“初始化成员列表”,于是自己上网查阅相关内容,最终搞明白了这个初始化成员列表的意思!下面就说说自己的理解!
要想理解初始化成员列表,那么首先你要搞明白构造函数的含义,构造函数说白了就是在新建类的对象时对类进行初始化的函数,它的最大特点是跟类的名称一样。更多构造函数的内容可参考资料(下载链接:http://pan.baidu.com/s/1jHx88dg 密码: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中的!
好了,关于的构造函数的初始化成员列表的理解分享就说到这里!以后若有新发现再补充在这个帖子中吧!
------------------------------------------
欢迎大家加入图像识别技术交流群:271891601,另外,特别欢迎成都从事图像识别工作的朋友交流,我的QQ号2487872782
- c++中类的构造函数的初始化成员列表详解!
- 构造函数的成员初始化列表
- C++中类的构造函数与析构函数(成员初始化列表)
- 在构造函数的参数化列表中调用基类构造函数初始化继承来的成员变量
- 在构造函数的参数化列表中调用基类构造函数初始化继承来的成员变量
- 必须在构造函数的成员初始化列表里初始化
- 成员初始化列表和构造函数体初始化的区别
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- 【C/C++】构造函数的初始化列表
- C++初始化列表中无默认构造函数的成员的初始化
- 构造函数初始化列表中成员变量必须初始化的几种情况
- 逆向程序
- 【SHELL】如何让一个脚本有错误时停下来?
- 进程与线程的形象解释
- python challenge 13-16关 攻略
- JAVA 中文字符转为拼音字符串
- c++中类的构造函数的初始化成员列表详解!
- iOS单页面支持横屏的几种方法总结
- 自由读书会第一集总结
- sdut 无尽走廊
- Jeecg引领企业开发潮流,开启插件开发时代,微信企业号插件(jeecg-p3-biz-qywx)首次发布
- Chrome 显示不了字
- android输入框EditText输入银行卡,输入手机,输入身份证格式化的实现
- JDBC -----对结果集的系列操作
- Java虚拟机结构分析