美文网首页PyQt程序员
C++初始化列表,知道这些就够了

C++初始化列表,知道这些就够了

作者: 223480235e8e | 来源:发表于2018-12-26 22:37 被阅读17次

在上一篇文章“正确理解Widget::Widget(QWidget *parent) :QWidget(parent)这句话”中,小豆君讲了为什么要这样写的原因,后来很多朋友给我发私信,问我初始化列表的事情。

所以,小豆君今天给大家总结下C++中的初始化列表。

下面我们先看例子

#include <iostream>
using namespace std;
class Base
{
public:
    Base(int val)

    {

        m_num = 0;
        cout << "create Base(int val)" << endl;
    }
private:
    int m_num;
};

上边的代码,我先定义了一个Base类,并且定义了有一个整型实参的构造函数Base(int val)

class BaseChild: public Base
{
public:
    BaseChild()
    {
        m_num = 0;
        cout << "create is BaseChild()" << endl;
    }

private:
    int m_num;
};



int main(int argc, char *argv[])
{
    BaseChild child;
}

上边的代码继承Base,定义了它的默认构造函数

并且在主函数中创建BaseChild的对象child

编译报如下错误:

image

这意思是说,没有Base的默认构造函数。

结论1:如果没有定义任何构造函数,C++编译器会自动创建一个默认构造函数。

结论2:如果已经定义了一个构造函数,编译器不会自动创建默认构造函数,只能显式调用该构造函数。

在C++中,当创建一个对象时,编译器要保证调用了所有子对象的构造函数,这是C++强制要求的,也是它的一个机制。

因为在Base中没有定义默认构造函数,只定义了一个有整型参数的构造函数,而BaseChild继承Base时,又没有显式地指定Base的构造函数,所以编译报错。

如果Base是不可以修改的,那么,我们用什么办法可以显式的调用Base的构造函数呢。答案就是初始化列表。

C++就为我们提供了这样的语法。即在冒号和这个构造函数定义体的左括号之间调用基类构造函数或初始化本类成员,如下:

BaseChild():Base(1)
{
    cout << "create is BaseChild()" << endl;
}

现在,再编译程序,轻松通过。

当然,初始化列表还可以对类本身的数据成员进行初始化,如对BaseChild成员m_num进行初始化:

BaseChild():Base(1), m_num(0){...}

中间要以逗号隔开。

细心的同学,可能会提问,我们平常见到的都是

int m_num = 0;

而刚刚的代码是m_num(0),这是正确的,我们可以认为这就是调用了int类型的构造函数。类似的,new int(2)是一样的道理。

最后,总结一下初始化列表:

1 因为初始化列表中无法直接初始化基类的数据成员,所以你需要在列表中指定基类的构造函数,如果不指定,编译器则会调用基类的默认构造函数。

2 推荐使用初始化列表,它会比在函数体内初始化派生类成员更快,因为在分配内存后,在函数体内又多进行了一次赋值操作。

3 初始化列表并不能指定初始化的顺序,正确的顺序是,首先初始化基类,其次根据派生类成员声明次序依次初始化。

最后也希望大家多多支持小豆君的创作,关注小豆君的公众号“小豆君Qt分享”,最新文章都会在公众号第一时间发布,或者你有不懂的问题,关注公众号后,可加好友或进Qt群获得答案。

相关文章

  • C++初始化列表,知道这些就够了

    在上一篇文章“正确理解Widget::Widget(QWidget *parent) :QWidget(paren...

  • C++初始化列表

    引言 用c++的人都知道,c++的构造函数具有初始化列表,初始化列表有什么作用?什么情况下必须使用初始化列表...

  • [C++之旅] 11 初始化列表

    [C++之旅] 11 初始化列表 初始化列表的特性 初始化列表先于构造函数执行 初始化列表只能用于构造函数 初始化...

  • C++的初始化列表和列表初始化

    C++的初始化列表和列表初始化 初始化列表 初始化列表是声明在构造函数中来实现的,相当于初始化,而不是复制操作 初...

  • Markdown:知道这些就够了

    推荐编辑器 Chrome最佳插件 - 马克飞象 跨平台软件,印象笔记爱好者肯定需要 - Haroopad/Subl...

  • 床垫:知道这些就够了

    思维导图 引言 睡眠不只事关明天,而是在今后的二十年里都很重要。睡在不合适的床垫上是引起背痛的一个主要原因 你与床...

  • C++初始化列表

    本文主要说明成员初始化列表的注意事项。 I、上帝视角看初始化列表 构造函数可以有两种构造形式,一是在构造函数体内对...

  • c++ 初始化列表

    初始化列表可以改变private里const 的值

  • 搞定英语,知道这些就够了!

    搞定英语,知道这些就够了 英语,这对于我们来说完全就是一个老生长谈的问题。 在我们十几年的学生生涯中他一直伴随我们...

  • SVG指令 知道这些就够了

    SVG指令常用来编辑图标等图片资源,当然,Android,也支持SVG指令设计图片,这篇博客收录了几个常用指令用法...

网友评论

    本文标题:C++初始化列表,知道这些就够了

    本文链接:https://www.haomeiwen.com/subject/rexllqtx.html