首页 > 其他分享 >59.有哪些情况必须用到成员列表初始化?作用是什么?

59.有哪些情况必须用到成员列表初始化?作用是什么?

时间:2023-07-05 09:47:57浏览次数:50  
标签:初始化 59 int 用到 列表 基类 成员 构造函数

59.有哪些情况必须用到成员列表初始化?作用是什么?

1.必须使用成员初始化的四种情况

① 当初始化一个引用成员时;

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

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

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

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

#include<iostream>
#pragma warning(disable:4996)
using namespace std;

class  BaseClass 
{
public:
    int basea;
    int baseb;
public:
    BaseClass(int ref1, int ref2): basea(ref1), baseb(ref2)
    {
    } 
};

class DerivedClass : public BaseClass
{
public:
    int derivedc;
public:
    DerivedClass(int arg1, int arg2, int arg3) : derivedc(arg1), BaseClass(arg2, arg3) {}  // 使用BaseClass的构造函数来初始化基类对象  
};

int main() 
{
    int m = 5;
    int n = 6;
    int p = 7;
    DerivedClass s(m, n, p);

    cout << s.basea << endl;
    cout << s.baseb << endl;
    cout << s.derivedc << endl;
}

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

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

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

2.成员初始化列表做了什么

①初始化基类:如果类有一个基类,可以在成员初始化列表中使用基类的构造函数来初始化基类对象。

#include<iostream>
#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)
using namespace std;

#include <iostream>  

using namespace std;

// 基类  
class BaseClass 
{
public:
    BaseClass(int a, int b)
    {
        x = a;
        y = b;
    }

    void printBaseClass() {
        cout << "Base class: (" << x << ", " << y << ")" << endl;
    }

protected:
    int x;
    int y;
};

// 派生类  
class DerivedClass : public BaseClass
{
public:
    DerivedClass(int a, int b, int c) : BaseClass(a, b) 
    {
        z = c;
    }

    void printDerivedClass()
    {
        cout << "Derived class: (" << x << ", " << y << ", " << z << ")" << endl;
    }

private:
    int z;
};

int main()
{
    DerivedClass derivedObj(1, 2, 3);
    derivedObj.printBaseClass();
    derivedObj.printDerivedClass();
    return 0;
}

② 初始化成员变量:对于每个成员变量,可以使用成员初始化列表来指定其初始值。成员初始化列表中的顺序与成员变量在类中声明的顺序一致。

#include<iostream>
#include <stdio.h>
#include <iostream>  
#include <stdlib.h>
#pragma warning(disable:4996)
using namespace std;

class MyClass 
{
public:
    MyClass() : member1(0), member2("default"), member3(123) {}  // 使用成员初始化列表初始化成员变量  
    void printMyClass()
    {
        cout << "Obj.member1 = " << this->member1 << ", "
             << "Obj.member2 = " << this->member2 << ", "
             << "Obj.member3 = " << this->member3 << endl;
    }
private:
    int member1;
    std::string member2;
    double member3;
};

int main()
{
    MyClass  Obj;
    Obj.printMyClass();
    return 0;
}

③默认参数:如果成员变量有一个默认参数,可以在成员初始化列表中使用默认参数来初始化成员变量。

class MyClass 
{
public:
    MyClass(int arg1, int arg2 = 0) : member1(arg1), member2(arg2) {} // 使用默认参数来初始化成员变量
private:
    int member1;
    int member2;
};

需要注意的是,如果类中没有明确定义构造函数,则编译器会生成一个默认构造函数。在这个默认构造函数中,成员初始化列表中的值将被忽略,而成员变量将被初始化为默认值。此外,在使用成员初始化列表时,需要确保列表中的类型与成员变量的类型匹配,否则将导致编译错误。

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

相关文章

  • 58.类成员初始化方式?构造函数的执行顺序 ?为什么用成员初始化列表会快一些?
    58.类成员初始化方式?构造函数的执行顺序?为什么用成员初始化列表会快一些?1.类成员初始化方式1.1初始化方式一:默认时初始化如果类成员没有被显式初始化,将会使用默认初始化。默认初始化指没有提供初始化式的情况下,将使用默认值进行初始化。对于基本数据类型(如整数、浮点数等),默认......
  • 29.初始化和赋值的区别
    在C++中,初始化和赋值是两个不同的概念。  需要注意的是,对于某些类型的变量,初始化和赋值的效果是一样的。例如,对于基本类型的变量,使用等号进行初始化和赋值的效果是一样的。但是对于一些复杂类型的变量,如类对象,初始化和赋值的效果是不同的。在这种情况下,初始化会调用类的构造函......
  • 28.拷贝初始化和直接初始化
    ●当用于类类型对象时,初始化的拷贝形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,拷贝初始化总是调用拷贝构造函数。拷贝初始化首先使用指定构造函数创建一个临时对象,然后用拷贝构造函数将那个临时对象拷贝到正在创建的对象。举例如下stringstr1("Iamastring......
  • 好用到飞起的新项目「GitHub 热点速览」
    虽然本周GitHub热榜都是一些熟悉的面孔,但还是有不少新开源的项目,比如受启发于StripeIDs的UUIDv7扩展typeid,相信有了它,数据标识问题就迎刃而解了。此外,还有刚开源就获得近2kstar的抠背景项目background-removal-js,一键就能去掉图片背景。还有一个非常有意思的IDE,它......
  • 如何把本地项目初始化到gitLab上去,干货分享!!
    说明:1.适用范围(高手请忽略)例如:你本地已经有一个项目了(或者别人发一个项目给你),但是你需要把这个项目托管到你的gitLab上去操作步骤:1.首先在你的gitLab上建一个空的工程目录(很简单,百度一下),建好之后看到应该是这个样子的,上面也有对应的使用说明,教你如何把本地项目上传文件到git......
  • Java中Map初始化时直接赋值的方法
    publicstaticfinalMap<String,String>BANK_TYPE=newHashMap<String,String>(){undefinedprivatestaticfinallongserialVersionUID=1L;//可有可无{undefinedput("ZX","中信银行");put("PN",&qu......
  • Eplan API -初始化
    EplanAPI-初始化Eplan支持的开发方式一共有3种脚本dll文件形式exe离线程式形式虽然eplan二次开发也支持vb语言,但这里只讨论c#脚本(script)Eplan脚本支持的功能有限,有限的原因在于其支持的程序集有限c#中的System;System.XML;System.Drawing;System.Windows.FormsEp......
  • 593. 有效的正方形
    难度中等174给定2D空间中四个点的坐标 p1, p2, p3 和 p4,如果这四个点构成一个正方形,则返回 true 。点的坐标 pi 表示为 [xi,yi] 。 输入没有任何顺序 。一个 有效的正方形 有四条等边和四个等角(90度角)。 示例1:输入:p1=[0,0],p2=[1,1],p3......
  • PPT| 某车企资产管理系统建设方案P59
    PPT总共有59页,受篇幅有限,有需要PPT的同学关注:智能制造数字化咨询......
  • Net6 中一个请求用到的
    Microsoft.AspNetCore.Hosting.HttpRequestIn.StartMicrosoft.AspNetCore.Hosting.BeginRequestMicrosoft.AspNetCore.Routing.EndpointMatched 终结点匹配Microsoft.AspNetCore.Mvc.BeforeOnActionExecuting--动作执行前Microsoft.AspNetCore.Mvc.AfterOnActionExecuting......