首页 > 其他分享 >110.成员初始化列表会在什么时候用到?它的调用过程是什么?

110.成员初始化列表会在什么时候用到?它的调用过程是什么?

时间:2023-07-12 21:34:50浏览次数:74  
标签:初始化 int 用到 列表 public 110 成员 构造函数

110.成员初始化列表会在什么时候用到?它的调用过程是什么?

1.当初始化一个引用成员变量时;

struct MyClass
{
    const int mya;
    int& myb;
    MyClass(int a, int& b) :mya(a), myb(b) {}
    ~MyClass() {}
};

2.当初始化一个非静态的常量成员时;

int a = 1;
class MyClass
{
public:
	const int mA;
	MyClass():mA(a)// 在初始化列表初始化mA的值
	{
	}
};

3.当调用一个基类的构造函数,而构造函数拥有一组参数时;

#include <iostream>

using namespace std;

class Base
{
public:
    Base(const string& str, int i) : Bstr(str), _i(i) // 使用const引用避免复制,
    {
        cout << "Base Constructor" << " Bstr = " << Bstr << ", _i = " << _i << endl;
    }

    string Bstr;
    int _i;
};
class Derived : public Base
{
public:

    // 调用基类构造函数,而它拥有一组参数时,要使用成员初始化列表
    Derived() : Base("DerivedStr", 200)  // 这个是正确的
    {
        //Base::Bstr = "DerivedStr"; // 基类构造函数再次之前调用,这里赋值没有用。
        //Base::_i = 200;
        cout << "Derived Constructor" << endl;
    }

    string Dstr;
};
int main()
{
    Derived d;
    return 0;
}

4.当调用一个成员类的构造函数,而他拥有一组参数;

#include <iostream>  
using namespace std;

class StuClass 
{
public:
    // 成员变量,存储了一个MemberClass对象  
    int studentNum;
    string studentName;
    int studentAge;

    // 主类的构造函数,使用成员初始化列表来初始化成员变量member  
    StuClass(int stuNum, string stuName, int stuAge) : studentNum(stuNum), studentName(stuName), studentAge(stuAge)
    {
    }
};

int main() 
{
    // 创建一个MainClass对象,并传递参数5给MainClass的构造函数  
    StuClass  obj(20211101, "悟空", 26);

    // 输出成员变量member的值,可以看到已经被初始化为5  
    cout << "学号:" << obj.studentNum << ",姓名:" << obj.studentName << ",年龄:" << obj.studentAge << endl;

    return 0;
}

5.成员类型是没有默认构造函数的类。

派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员;如果基类没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。

则必须在派生类构造函数的初始化列表阶段显示调用

class A
{
public:
	A(int x)	//因为我们写了构造函数,所以这个类没有默认构造函数了
	{
		_a = x;
	}
public:
	int _a;
};
 
class Data
{
public:
	Data(int year = 0, int month = 0, int day = 0) :a(0)	//使用初始化列表初始化
	{
		_year = year;
		_month = month;
		_day = day;
	}
 
private:
	int _year;
	int _month;
	int _day;
	A a;	//创建一个类的对象
};

5.编译器会一一操作初始化列表,以适当顺序在构造函数之内安插初始化操作,并且在任何显示用户代码前。list中的项目顺序是由类中的成员声明顺序决定的,不是初始化列表中的排列顺序决定的。

参考资料来源:

阿秀

标签:初始化,int,用到,列表,public,110,成员,构造函数
From: https://www.cnblogs.com/codemagiciant/p/17548909.html

相关文章

  • 【雕爷学编程】Arduino动手做(113)---5110液晶屏模块2
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是......
  • Forex嘉盛集团kaihu要求及步骤(外汇110网)
    Forex嘉盛集团kaihu有什么要求?这是最近备受关注的话题,很多人都在热议,到底嘉盛集团kaihu需要满足什么条件?今天我们就来给大家揭秘。首先,嘉盛集团是一家专业的外汇交易平台,对于kaihu要求非常严格。想要kaihu的用户需要提供个人身份证明、银行卡信息、电话号码等多项资料,同时还需要......
  • JAVA static静态变量依赖spring实例化变量,可能导致初始化出错
    在Java中,静态变量是在类加载时初始化的,而实例变量是在对象实例化时初始化的。如果静态变量依赖于Spring实例化的变量,可能会导致初始化出错的问题。这是因为Spring的实例化过程是在运行时进行的,而类加载和静态变量初始化是在编译时进行的。当静态变量依赖于Spring实例化的变量时,如果......
  • 03-kubeadm初始化Kubernetes集群
    集群部署架构规划:节点网络:192.168.1.0/24Service网络:10.96.0.0/12Pod网络:10.244.0.0/16  部署方法参考:https://github.com/kuberneteskop方式:AWS(AmazonWebServices)andGCE(GoogleCloudPlatform)arecurrentlyofficiallysupportedkubeadm方式:https://github.com......
  • Vue 先初始化子组件再初始化父组件的方法(自定义父子组件mounted执行顺序)
    写在前面:本篇内容内容主要讲述了,在使用Konva进行开发过程中遇到的一些问题。(既然是组件加载顺序,主要牵扯到的就是,父子组件的关系,父子组件的生命周期)众所周知,Vue中父子组件生命周期的执行顺序为://挂载阶段父beforeCreate->父created->父beforeMount->子beforeCre......
  • 结构体,指针函数和数组初始化
    struct_m_malloc_dev{void(*init)(uint8_t);//初始化函数uint8_t(*perused)(uint8_t);//内存使用率uint8_t*membase[SRAMBANK];//内存池管理srambank个区域的内存uint16_t*memmap[SRAMBANK];//内存管理状态表uint8_tmemrdy[SRAMBANK];//内存管理......
  • c语言结构体指针初始化
    结构体定义结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。结构是C编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。结构体中的数据成员可以是基本数据类型(如int、float、char等),也可以是其他结构体类型、指针类型等......
  • 服务器初始化 步骤
    更新系统包:yum-yupdate  关联包:yuminstallgccgcc-c++makecmakentpredhat-lsblrzszflexbyacclibpcapncursesdevellibpcap-develpsmisc   编译安装iftop安装:yuminstall-yflexbyacclibpcapncurses-devellibpcap-develwgethttp://www.ex-parr......
  • springcloud 可能会用到的依赖
    springcloud需要上官网看版本适配不然可能会出现意想不到的问题此笔记使用maven版本 3.8.4<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"x......
  • 解决升级Jeesite版本(gradle构建),可能导致初始化数据库数据失败的问题?
    1、核心模块core下的资源文件,因存放在java文件路径下,不规范可能导致找不到初始化数据表。报错截图:  解决办法:在core文件夹下的资源文件复制一份初始化数据表。 2.cms文件使用gradle构建时,需要build文件里的jar包,如果缺少可能会报找不到cms初始化数据库文件。  解......