首页 > 编程语言 >C++中的初始化列表

C++中的初始化列表

时间:2024-11-20 18:17:15浏览次数:3  
标签:初始化 int 成员 C++ 列表 赋值 构造函数

初始化参数列表

用于在构造函数中初始化类的数据成员。

语法:构造函数():属性1(值1),属性2(值2)......{ }

性质:

1.只能在构造函数中使用

2.引用 或 常量必须在初始化参数列表中初始化

3.初始化的顺序和成员变量的顺序一致,与初始化参数列表中的顺序无关

#include<iostream>
#include<vector>
using namespace std;
class A {
	int a;
	int b;
	int c;
	int& e;
	const int d;
public:
	A(int a1, int b1, int c1) :b(a), a(a1), c(c1), e(a1), d(b1) {
		e = a1;//报错,构造函数用于给成员变量赋值,引用不能在构造函数中初始化
		cout << a << " " << b << " " << c;
	}
};
int main() {
	A p(1, 2, 3);
	return 0;
}

初始化列表的做用:

1)初始化const和引用成员

对于 const (常量)成员变量和引用类型的成员变量,它们在定义后不能再被赋值

class fun {
    const int a;
    int& b;
public:
    //在这个构造函数的初始化列表中,可以对 const 成员 a 和引用成员 b 进行初始化。
    fun(int x, int& y) : a(x), b(y) {
            
    }
};

2)提高效率

对于一些复杂的对象,如包含其他对象的类。如果不用初始化列表,而是在构造函数体内赋值,会先调用默认构造函数创建成员对象,然后再调用赋值运算符进行赋值。而使用初始化列表可以直接调用拷贝构造函数初始化成员对象,避免了不必要的默认构造过程,从而提高了效率。

3)保证初始化顺序

成员变量的初始化顺序是按照它们在类定义中出现的顺序,而不是初始化列表中的顺序。这有助于明确成员初始化的顺序,避免因顺序混乱导致的错误。

初始化列表和在构造函数体内赋值的区别:

1.初始化时机

列表初始化:

是在对象创建时进行初始化,属于初始化阶段。成员变量在进入构造函数体之前就已经完成初始化。

构造函数体内赋值:

是在对象已经初始化完成后,在构造函数的执行体中对成员变量进行赋值操作。

2.性能差异

列表初始化:

对于基本类型和一些简单对象,性能差异可能不明显。但对于复杂对象,特别是涉及到资源获取(如动态内存分配)的成员,列表初始化可以避免先默认构造再赋值的过程,效率更高。

构造函数体内赋值:

如果对象有默认构造函数,先调用默认构造函数进行初始化,之后在构造函数体内又进行赋值操作,可能会涉及额外的资源消耗和时间开销。

3.初始化要求

列表初始化:

如前所述,不允许窄化转换,能保证数据的安全性和准确性。

构造函数体内赋值:

可以进行隐式类型转换,这可能会导致数据丢失或不符合预期的结果,当然也可以通过一些手段(如 explicit 关键字)来控制类型转换。

标签:初始化,int,成员,C++,列表,赋值,构造函数
From: https://blog.csdn.net/2401_88249494/article/details/143921933

相关文章

  • CSS入门(主要讲解字体,链接,列表,表格)
    一.CSS字体1.CSS字体属性要定义字体的加粗,大小,文字样式2.设置字体系列font-family属性设置文本的字体系列。font-family属性应该设置几个字体名称作为一种"后备"机制,如果浏览器不支持第一种字体,他将尝试下一种字体。注意:如果字体系列的名称超过一个字,它必须用引号,如Fo......
  • Python那些事儿 - 列表的增删改查
    第八回 登峰造极前言上一回给大家分享了列表的定义、索引、遍历以及列表推导式,这一回我们对列表的增删改查进行详细的讲解。让我们一起在知识的海洋里遨游吧!......
  • 31. C和C++混合开发
    一、C和C++混合开发    C++可以看作是C语言的增强版,在C的基础上扩展了更多的功能。一个C程序可以看作一个简单的C++程序。但是C++和C语言之间还是存在区别的。例如,C++支持函数名重载,而C不支持,因此编译器生成目标文件时,函数名在目标文件中的临时内部名......
  • 【Linux Ops】如何替换 libstdc++ 提升 GLIBCXX 版本
    【环境】kos5.8sp2,kernel5.10还是上一篇提到的那个软件环境,其依赖的GLIBCXX版本较高,因此在安装时给出了以下错误:xxx:/lib64/libstdc++.so.6:version`GLIBCXX_3.4.29'notfound(requiredbyxxx)执行strings/usr/lib64/libstdc++.so.6|grepGLIBCXX,查看当前环境中......
  • Pylon C++ Programmer's Guide
    移步至PylonC++Programmer'sGuide观看效果更佳GettingStartedpylon编程指南是一个关于如何使用BaslerpylonC++API进行编程的快速指南。它可以与pylon示例代码一起使用,以帮助初学者入门。此外,APIrenfence提供了有关BaslerpylonC++接口的描述。接口的描述也可在pylon的......
  • 直接生成列表
    您可以使用Java8的流式API和方法引用来使代码变得更简洁。以下是简化后的代码:request.setSysList(Collections.singletonList("sss"));或者,如果您需要更多的灵活性,可以使用流式API:request.setSysList(Stream.of("sss").collect(Collectors.toList()));这两种方式都可......
  • 1.C++基础知识—指针篇
    #指针#变量#1.一个整型数 intnumber;2.一个指向整型数的指针 int* ptrToInt;3.一个指向指针的指针,它指向的指针是指向一个整型数int**ptrToPtrToInt;4.一个有10个整型数的数组intarry[10];5.一个有10个指针的数组,该指针是指向一个整型数的int*ptrArray[10];6......
  • C++基础知识-const篇
    1.const作用在C++中,const 关键字用于定义常量,确保某些数据不会被修改。const的作用包括但不限于以下几点:1.定义常量值:  const 可以用来定义不会改变的常量值  constintMAX_USERS=100;2.修饰指针:  const可以修饰指针,以限制指针指向的数据是否可以被修改......
  • Windows右键新建列表排序
    前言全局说明Windows右键新建列表排序一、说明环境:Windows11家庭版23H222631.3737二、Windows11右键新建列表排序2.1打开注册表项HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\ShellNew2.2编辑Classes键......
  • 【c++笔试强训】(第十六篇)
    目录游游的⽔果⼤礼包(枚举)题目解析讲解算法原理编写代码买卖股票的最好时机(⼆)(贪⼼)题目解析讲解算法原理编写代码游游的⽔果⼤礼包(枚举)题目解析1.题目链接:登录—专业IT笔试面试备考平台_牛客网2.题目描述题目描述游游有nnn个苹果,mmm个桃子。她可以把2个苹......