c++中类的构造函数的初始化成员列表详解

昨天傍晚在阅读OpenCV的Mat类文档时看到代码如下

inline Mat::Mat() : size(&rows)
{
    initEmpty();
}

第一行中单冒号及其后边的内容我完全不知道是什么意思,前所未见,闻所未闻,于是查阅相关资料并询问了群里边的相关大神,最后得到的答案是冒号后边是“初始化成员列表”,于是自己上网查阅相关内容,最终搞明白了这个初始化成员列表的意思!下面就说说自己的理解!

要想理解初始化成员列表,首先要搞明白构造函数的含义,构造函数说白了就是在新建类的对象时进行初始化的函数,它的最大特点是跟类的名称一样。更多构造函数的内容可参考资料(下载链接:https://pan.baidu.com/share/init?surl=jHx88dg 提取码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()可以重写为:

 point(int m=0,int n=0):x(m),y(n)
 {     }

这样咋一看没有什么不同,确实,对于上面的这种简单列子来说,也真的没有太大不同。但是参考Lippman的《C++ Primer》,我们发现C++的语法规定,以下三种情况必须使用初始化成员列表:
① 需要初始化的数据成员是对象的情况;
② 需要初始化const修饰的类成员;
③ 需要初始化引用成员数据;

关于第②种情况和第③种情况如果不明白,可以参考下面这篇博文:

https://blog.csdn.net/fengguangle/article/details/78019905

再看我昨天傍晚遇到的代码:

inline Mat::Mat() : size(&rows)
{
    initEmpty();
}

是属于哪种情况呢?

联想到参数传递的三种情况,具体可参考我的另一篇博文(链接 https://blog.csdn.net/wenhao_ir/article/details/51611388

可见,属于第③三种情况,即需要初始化引用成员数据,在这里“size(&rows)”相当于“size = rows”

再说第①种情况,即“需要初始化的数据成员是对象的情况”。

看下面的一段代码:

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是一个对象成员,所以必须用列表的形式给出,初始化成员列表实际上就是在构造函数的首行以单冒号开始的部分。

好了,关于的构造函数的初始化成员列表的理解分享就说到这里!以后若有新发现再补充在这个帖子中吧!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值