首页 > 编程语言 >C++ - 中必须使用初始化列表初始化的四种情况

C++ - 中必须使用初始化列表初始化的四种情况

时间:2024-04-18 11:23:12浏览次数:14  
标签:初始化 const int C++ 列表 CBase public

1. 必须使用初始化列表初始化一个引用成员;

class CBase
{
public:
    CBase(int a) : m_a(a)  //正确,m_a是一个变量的引用,必须通过初始化列表初始化
    {
        // m_a = a;           //错误
        cout << "m_a:" << m_a << endl;
    }

public:
    int& m_a;
};

 

2. 必须使用初始化列表初始化一个常量成员;

class CBase
{
public:
    CBase(int a) : m_a(a)  //m_a是一个const常量,必须通过初始化列表初始化
    {
        //m_a = a;          //错误,此处相当于赋值操作,但是const是不可修改的,无法作为左值;
    }

public:
    const int m_a;
};

 

3. 初始化派生类的基类时,必须使用初始化列表进行初始化;(并且基类中没有无参构造函数)

#include <iostream>
using namespace std;


class Test 
{
public:
    //Test() 
    //{ 
    //    cout << "Test 无参构造" << endl;
    //};
    Test(int x) 
    {
        m_x = x; 
        cout << "Test 有参构造" << endl;
    };

    void show() 
    {
        cout << m_x << endl;
    }

private:
    int m_x;
};

class Mytest :public Test
{
public:
    Mytest(): Test(10)
    {
        // 构造函数只能在初始化列表中被显示调用(如果不显示初始化,默认调用默认构造函数),不能在构造函数内部被显示调用
        // 内部调用的是临时变量
        //Test(110);      
        cout << "Mytest 无参构造" << endl;
    };
};


int main()
{

    Mytest mytest;

    return 0;
}

 

4. 当初始化话成员对象时,必须使用初始化列表进行初始化;

class CBase
{
public:
    CBase(int a) : m_a(a)  //m_a是一个const常量,必须通过初始化列表初始化
    {
        //m_a = a;          //错误,此处相当于赋值操作,但是const是不可修改的,无法作为左值;
    }

public:
    const int m_a;
};


class CSub
{
public:
    CSub() : m_obj(88)    //正确, 成员对象初始化
    {
        cout << "this is m_obj::m_a = " << m_obj.m_a << endl;
    }

public:
    CBase m_obj;
};

 

标签:初始化,const,int,C++,列表,CBase,public
From: https://www.cnblogs.com/zhuchunlin/p/18143103

相关文章

  • C++实现string存取二进制数据的方法
    这篇文章主要介绍了C++实现string存取二进制数据的方法,针对STL中string的用法进行了较为详细的分析,需要的朋友可以参考下 本文实例讲述了C++实现string存取二进制数据的方法,分享给大家供大家参考。具体方法分析如下:一般来说,STL的string很强大,用起来也感觉很舒服,这段时间在......
  • 【字符编码】c++编码格式及转换
    参考资料:字符编码笔记:ASCII,Unicode和UTF-8通俗易懂wstring和string的区别wstring和string是C++中的两种字符串类型,它们的主要区别在于字符编码和存储方式。字符编码:string使用单字节字符编码,通常使用ASCII编码或其扩展(如UTF-8)。wstring使用宽字符编码......
  • c++ std::string能否存储二进制字符以及'\0'字符?
    c++的字符串类std::string能否存储二进制字符以及字符'\0'?要解决这个问题,我们首先要了解c++的std::string的存储结构。(注意不同的平台下C++规范对std::string的实现不完全一致,例如sizeof(std::string)在linuxx64gcc-4.4下的输出是8,而在macgcc4.2下的输出是24;这篇文章以Li......
  • Qt/C++音视频开发70-无感切换通道/无缝切换播放视频/多通道流畅切换/不同视频打开无缝
    一、前言之前就写过这个方案,当时做的是ffmpeg内核版本,由于ffmpeg内核解析都是代码实现,所以无缝切换非常完美,看不到丝毫的中间切换过程,看起来就像是在一个通道画面中。其实这种切换只能说是取巧办法,最佳的办法应该是公用一个openglwidget窗体,解码线程那边开两个,第二个解码线程打开......
  • 2024蓝桥杯省赛C/C++程序设计A组题目简析
    2024蓝桥杯省赛C/C++程序设计A组题目简析A题意:计算一段区间内日期的中文表达的总笔画数>50的天数按照题意枚举即可。注意个位数字前面需要加一个“零”,也就是多13笔。B题意:\(5\times5\)的棋盘下五子棋,最终下满棋盘并和棋的情况数dfs或者遍历二进制去枚举棋子位置的情况均可......
  • C++排序问题
    冒泡排序若得到一个从小到大的数组例如:3527481角标:1234567就是角标1和角标2比,若1大于2,就交换位置,然后角标2和角标3比,若2大于3,就交换位置第一趟:3254718第二趟:2345178以此类推。。。。点击查看代码#include<bits/stdc++.h>usingnamespaces......
  • Ubuntu系统初始化
    修改root密码sudopasswdsuroot网卡管理#自动获取IPdhclientens33安装sshsudoaptupdatesudoaptinstallopenssh-serversudosystemctlstatussshd防火墙管理#Ubuntu自带一个配置防火墙配置工具,称为UFW。如果防火墙在你的系统上被启用,请确保打开了......
  • [9] UE C++ Snake
    思维导图背景地图制作创建瓦片集角色素材GameMode功能游戏开始控制食物的生成食物生成池(性能优化)/**形参如果是一个引用,且没有添加const关键字,代表实参想要借助形参修改值*param是否指定生成时候的地址*/voidASnakeGameModeBase::SpawnFood(FVector&Spaw......
  • 编写ROS2(C++语言)软件包的步骤
    0简介介绍编写ROS2(C++语言)软件包的步骤;0.1前置条件参考x.1,和x.2,安装ROS2和编译工具;1创建ROS2软件包以下的指令,创建一个名为mtuav-sns-radar-ros2的ROS2软件包,使用ament_cmake作为构建系统,许可证类型为Apache-2.0,并包含一个名为radar_node的节点;mkdir-p~/ros2_ws/srccd......
  • Unity超简单2步制作列表组件方法
    1、创建画布(Canvas),并创建UI→滚动视图(ScrollView);2、展开Viewport,选中Content,添加组件GridLayoutGroup和ContentSizeFitter;单元格大小Y修改每一个列表项的高度,到这里列表组件就制作好了。下面是制作列表项。3、右键Content,创建空物体GameObject,改名为item;4、右键item,U......