C++ —— 常见的初始化

[C++深入] --- 类成员初始化的三种方式 初始化列表是在构造函数冒号后对成员进行初始化,这是在成员被分配内存的同时进行的初始化操作。这样避免了成员变量先被默认构造然后再赋值的过程。 阅读详情
AI摘要

本文介绍了C++中常见的初始化类型,包括默认初始化、直接初始化、拷贝初始化等十一种。详细说明了每种初始化的特点,如默认初始化是声明变量时未提供初始值,列表初始化使用大括号,延迟初始化可优化性能等。

目录

一,默认初始化(Default Initialization)

二,直接初始化(Direct Initialization)

三,拷贝初始化(Copy Initialization)

四,值初始化(Value Initialization)

五,列表初始化(List Initialization)

六,成员初始化列表(Member Initialization List)

七,显式初始化(Explicit Initialization)

八,静态初始化(Static Initialization)

九,引用初始化(Reference Initialization)

十,聚合初始化(Aggregate Initialization)

十一,延迟初始化(Lazy Initialization)


参考:

C++中常见的初始化类型_c++初始化类-优快云博客

https://en.cppreference.com/w/cpp/language/initialization

        变量的初始化是在构造时提供其初始值,初始值可以在声明或新表达式的初始化部分提供;初始化也发生在函数调用期间:函数参数和函数返回值也被初始化;

#include <iostream>
//类类型
class MyClass {
public:
    //无参默认构造函数
    MyClass()
        : x(0)
    { std::cout << "MyClass() default constructor" << std::endl; }
    //有参构造函数
    MyClass(int val)
        : x(val)
    { std::cout << "MyClass(int val) default constructor" << std::endl; }
    //拷贝构造函数
    MyClass(const MyClass& other)
        : x(other.x) 
    { std::cout << "MyClass(const MyClass& other) copy constructor" << std::endl; }

    int x;
};

一,默认初始化(Default Initialization)

默认初始化是指在声明变量时未提供初始值;

  • 内置类型变量,值未定义;
  • 类类型变量,调用其默认构造函数;

Syntax

T object ;
new T
int main() {
    int a;        //内置类型,值未定义
    MyClass obj;  //类型类型,调用 MyClass 的无参默认构造函数,输出 0 
    new MyClass;
    return 0;
}

二,直接初始化(Direct Initialization)

直接初始化使用显式构造函数初始化对象;

Syntax

T object ( arg );

T object ( arg1, arg2, ... );

T object { arg };
T ( other )

T ( arg1, arg2, ... )

static_cast< T >( other )
new T( args, ... )
Class::Class() : member( args, ... ) { ... }
[arg]() { ... }lambda表达式(C++11)
int main() {
    MyClass obj(10);  //调用 MyClass(int) 有参构造函数 
    return 0;
}

三,拷贝初始化(Copy Initialization)

拷贝初始化是另一个对象初始化该对象,调用拷贝构造函数或移动构造函数;

Syntax

T object = other;
T object = {other};{}拷贝初始化对象(C++11)
f(other)值传参
return other;值返回
throw object;

catch (T object)

值抛出和捕获
T array[N] = {other-sequence};初始化每个元素
int main() {
    MyClass obj1(10);  // 调用 MyClass(int) 构造函数
    MyClass obj2 = obj1;  // 调用拷贝构造函数 
    return 0;
}

四,值初始化(Value Initialization)

值初始化使用空值构造对象时执行的初始化;

  • 对于类类型,会调用其默认构造函数;

Syntax

T ()匿名临时对象
new T ()动态构造对象
Class::Class(...) : member () { ... }使用成员初始化对象
T object {};{}初始化对象(C++11)
T {}{}匿名临时对象(C++11)
new T {}{}动态构造对象(C++11)
Class::Class(...) : member {} { ... }{}使用成员初始化对象(C++11)
int main() {
    int a = int();  //初始化为 0
    MyClass obj = MyClass();  //匿名对象,调用 MyClass 的默认构造函数
    return 0;
}

五,列表初始化(List Initialization)

列表初始化使用大括号 `{}` 进行初始化;

  • C++11引入,可以避免窄化转换,并支持统一的初始化方式;

Syntax

Direct-list-initialization

T object { arg1, arg2, ... };
T { arg1, arg2, ... }
new T { arg1, arg2, ... }
Class { T member { arg1, arg2, ... }; };
Class::Class() : member { arg1, arg2, ... } {...

Copy-list-initialization

T object = { arg1, arg2, ... };
function ({ arg1, arg2, ... })
return { arg1, arg2, ... };
object [{ arg1, arg2, ... }]
object = { arg1, arg2, ... }
U ({ arg1, arg2, ... })
Class { T member = { arg1, arg2, ... }; };
int main() {
    int a{5};         //初始化为 5
    MyClass obj{10};  //调用 MyClass(int) 有参构造函数    
    return 0;
}

六,成员初始化列表(Member Initialization List)

用于在类的构造函数中初始化成员变量;

#include <iostream>
 
class MyClass {
public:
    MyClass(int a, int b) 
    : x(a), y(b) 
    { std::cout << "MyClass(int, int) constructor" << std::endl; }

    int x;
    int y;
};
 
int main() {
    MyClass obj(10, 20);  //使用成员初始化列表 
    return 0;
}

七,显式初始化(Explicit Initialization)

使用显式构造函数进行初始化,防止隐式转换;

#include <iostream>
 
class MyClass {
public:
    explicit MyClass(int val) 
    : x(val) 
    { std::cout << "explicit MyClass(int) constructor" << std::endl; }

    int x;
};
 
int main() {
    MyClass obj1(10);  //直接初始化
    // MyClass obj2 = 10;  // 错误:不能进行隐式转换 
    return 0;
}

八,静态初始化(Static Initialization)

静态变量的初始化

  • 常量初始化(Constant initialization),将静态变量的初始值设置为编译时常数;
  • 零初始化(Zero initialization),设置对象的初始值为0;

零初始化 Syntax

static T object ;
T () ;

T t = {} ;

T {} ; (C++11)

CharT array [ n ] = " short-sequence ";
#include <iostream>
 
class MyClass {
public:
    static int count;
    static const int constant;
};
 
int MyClass::count = 0;  //静态初始化
const int MyClass::constant = 42;  //常量初始化

九,引用初始化(Reference Initialization)

引用变量必须在声明时进行初始化,且引用类型的初始化方式与其引用对象一致;

#include <iostream>
 
int main() {
    int x = 10;
    int& ref = x;  //引用初始化 
    return 0;
}

十,聚合初始化(Aggregate Initialization)

用于聚合类型(如数组和 `struct`),直接使用大括号 `{}` 为成员变量赋值;

Syntax

T object = { arg1, arg2, ... };
T object { arg1, arg2, ... };(C++11)
T object = { .des1 = arg1 , .des2 { arg2 } ... };(C++20)
T object { .des1 = arg1 , .des2 { arg2 } ... };(C++20)
#include <iostream>

struct MyStruct {
    int a;
    float b;
};
 
int main() {
    MyStruct s1 = {1, 2.5f};  //聚合初始化
    int arr[3] = {1, 2, 3};   //数组的聚合初始化
    return 0;
}

十一,延迟初始化(Lazy Initialization)

延迟初始化是指在需要时才进行初始化,常用于优化性能,减少资源占用;

#include <iostream>
#include <memory>
 
class MyClass {
public:
    MyClass() {
    { std::cout << "MyClass() default constructor" << std::endl; }

    void doSomething() 
    { std::cout << "Doing something" << std::endl; }
};
 
int main() {
    std::unique_ptr<MyClass> ptr;  // 声明但不初始化
    // ...
    if (!ptr) {
        ptr = std::make_unique<MyClass>();  // 在需要时初始化
    }
    ptr->doSomething(); 
    return 0;
}

C++:类的简单介绍(六)——初始化列表 1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)引用成员变量const成员变量自定义类型成员(且该类没有默认构造函数时)除了以上三类,其他的成员变量在初始化列表或者在函数体({}内部的)的使用影响都不是很大!但是还是建议使用初始化列表。 阅读详情

相关推荐

【C++】4-1.13 class构造函数初始化列表

【C++】4-1.13 class构造函数初始化列表背景二级目录三级目录 背景 为什么需要构造函数初始化列表? 如果class类的数据域是一个对象类型,被称为内嵌对象(即对象中的对象); 而内嵌对象必须在被嵌对象的构造函数体执行前就构造完成,那么就需要构造函数初始化列表; 如下: 二级目录 三级目录 ...

jn10010537的博客 1263

C++的各种初始化

原因同样是创建对象时,要初始类成员的每一个成员(如果没有在初始化列表里面,编译器会自动使用它的默认的构造函数进行初始化,但是它没有默认构造函数,所以会编译报错,所以没有默认构造函数的成员变量需要使用初始化列表进行初始化)能用直接初始化和拷贝初始化的地方都能用列表初始化,而且列表初始化能对容器进行方便的初始化,因此在新的C++标准中,推荐使用列表初始化的方式进行初始化。值初始化和默认初始化一样,对于内置类型初始化为0,对于类类型则调用其默认构造函数,如果没有默认构造函数,则不能进行初始化。

czw 8234

29、C++ 初始化详解

本文详细解析了 C++ 中的初始化机制,涵盖数组初始化(包括二维数组和字符数组)、引用初始化的规则、列表初始化的使用及注意事项,以及初始化列表构造函数等内容。通过示例代码和详细说明,帮助开发者更好地理解和掌握 C++ 初始化的各种方式和常见错误的规避方法。

rr23456的博客 79

C++学习——类的初始化

文章目录1.类通过构造函数进行数据成员初始化2.类成员初始化方式?3.什么情况下必须使用列表初始化?4.为什么用列表初始化成员变量会快一些?5.派生类构造函数的执行顺序 1.类通过构造函数进行数据成员初始化 一般来说,类中的数据成员是私有的,不能通过对象共有访问的方式对数据成员赋初始值。一般来说,构造函数就是用来用来在创建对象时初始化对象, 为对象数据成员赋初始值。 构造函数是类的一种特殊成员函数,不需要人为调用,而是在建立对象时自动被执行。 2.类成员初始化方式? 赋值初始化,通过在函数体内进行赋值初始化

zxr916的博客 1万+

无源低通滤波器

无源RC滤波器“滤除”不需要的信号,因为它们分离并允许仅通过其频率的正弦输入信号,最简单的是无源低通滤波器网络。在低频应用(高达100kHz)中,无源滤波器通常使用简单的RC(电阻-电容)网络构建,而高频滤波器(高于100kHz)通常由RLC(电阻-电感-电容)元件制成。无源滤波器由电阻器、电容器和电感器等无源元件组成,没有放大元件(晶体管、运算放大器等),因此没有信号增益,因此它们的输出电平始终小于输入。滤波器是根据它们允许通过它们的信号的频率范围来命名的,同时阻挡或“衰减”其余部分。

weixin_44448586的博客 1万+

STM32嵌入式开发实战:如何用miniLZO压缩算法节省70%存储空间(附完整工程)

本文详细介绍了如何在STM32嵌入式开发中使用miniLZO无损压缩算法实现高达70%的存储空间节省。通过对比分析不同轻量级算法,重点讲解miniLZO的内存优化配置、分块压缩策略和完整工程实现,帮助开发者有效解决嵌入式系统中的存储瓶颈问题。

ss78901的博客 881

每日C++ - STL常见容器初始化

每日C++ - STL常见容器初始化 我们在日常使用 STL 模板库时,往往忽略了容器初始化的特征。这里我们来讨论下常见容器的初始化。 list 初始化 list 支持的初始化形式很多,我们可以查看 list 的源码实现,常见初始化方式如下: list<int> list1; // 默认初始化 list<int> list2(10); // 初始化 list,list 包含 10 个为 0 的元素 list<int> list3(10, 1); // 初始化 li

whose book 的博客 3734

SAP系统中PP模块全配置文档

配置路径IMG>SAP NetWeaver>常规设置>维护日历>工厂日历事务代码SCAL要求传输工厂代码描述日历代码日历描述起始日期星期一星期二星期三星期四星期五星期六星期日有效开始日期有效结束日期1000南微医学工厂MT南微医学工厂日历√√√√√√√201820502.4定义工厂配置路径IMG>生产>物料清单>常规数据>定义BOM状态事务代码OS23要求传输配置路径IMG>生产>主数据>资源>常规数据>标准值>定义参数。

yanzibing99的博客 1890

C++中常见的初始化类型

在C++中,初始化变量的方法非常多,涵盖了多种类型的初始化方式。

GOLOJO的博客 1666

ArcGIS 10.2.2自带Python 2.7.5环境配置全攻略:从pip安装到gdal、arcpy调用

本文详细指导如何在ArcGIS 10.2.2自带的Python 2.7.5环境中进行高效配置。核心内容包括安装pip包管理器、部署gdal等关键地理数据处理库,并确保arcpy模块的无缝调用。通过解决路径配置与PyCharm集成问题,帮助用户在此经典环境中构建稳定、兼容的地理信息自动化工作流,有效连接ArcGIS桌面功能与Python脚本编程。

moon9的博客 767

用RFSoC ZU47DR搭建软件无线电原型:从零配置Vivado到生成第一个射频信号

本文详细介绍了如何使用Xilinx RFSoC ZU47DR开发板搭建软件无线电原型系统,从Vivado环境配置到生成首个射频信号的全流程。通过整合ARM处理器、FPGA逻辑和高速ADC/DAC,该平台为通信算法验证提供了高效解决方案,特别适合SDR开发者和通信工程师快速实现原型设计。

weixin_26763955的博客 589

C++ Primer:常见类型的初始化

C++:常见类型的初始化1. 背景2. 初始化 1. 背景 常见类型 包含 内置类型 整型(布尔型,字符型,整型)、浮点型 复合类型 引用、指针、数组 标准库类型 string、vector 2. 初始化 整型和浮点型初始化时会自动进行类型转换。 #include <iostream> using namespace std; int main() ...

北冥有鱼wyh的博客 400

HTML爱心字母雨(完整代码)

HTML语言实现爱心字母雨的完整代码。

AIGC 2万+

C++语言99个常见编程错误 常见错误55:运行期静态初始化次序

常见错误55:运行期静态初始化次序 所有C++代码中的静态数据都会被访问之前完成初始化。大多数情况下,此种初始化工作都会完成与二进制镜像(program image)已加载,而代码的执行还未开始的时刻。如果未给它们指定初始化物,它们就会被以全零模式(all zeros)初始化。  最好的预防运行期静态初始化困境的办法就是尽可能地减少外部链接的变量,包括静态的class数据成员。预防运行期静态初始化...

eyetired的博客 454

漫画安全HIDS、EDR、NDR、XDR

漫画安全HIDS、EDR、NDR、XDR

墨痕诉清风的博客 3445

NLP高频面试题(一)——Transformer的基本结构、作用和代码实现

本文详细介绍了Transformer模型的基本结构和PyTorch代码实现过程。首先解析了Transformer的核心组成部分,包括嵌入层、多头自注意力机制、位置编码、前馈神经网络、编码器和解码器等模块,并通过清晰的代码示例逐步展示了如何在PyTorch中构建完整的Transformer模型。文末提供了一个可运行的简单示例,帮助读者快速理解并实践Transformer的核心原理与实现方法。

WeLearnNLP 1026

int指针初始化_C++面试常见问题(一) 指针

首先,指针声明如下:int 这表明*p的类型为int。由于*运算符(解引用运算符)被用于指针,因此p变量本身必须是指针。我们说p指向int类型,还说p的类型是指向int的指针,或int*。总之,p是指针,而*p是int,而不是指针。顺便说一句,*运算符两边的空格是可选的。传统上,程序员使用这种样式:int 这强调*ptr是一个int类型的值,也有下面这种格式:int这强调的是,int*是一种类型—...

weixin_39853523的博客 484

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++20范围for循环重大升级:如何正确使用初始化避免常见陷阱?

掌握C++20范围for循环的初始化技巧,有效避免作用域与性能陷阱。本文解析其在函数返回值和临时对象中的应用,介绍如何通过初始化提升代码安全与可读性,是现代C++开发的重要实践方法,值得收藏。

Algorhythm的博客 343

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

《C++ set 常见错误案例:未初始化、越界访问与解决办法》

在 C++ 中使用set容器时,未初始化和越界访问是两大常见错误。通过声明时初始化(如列表初始化)来避免,确保容器状态稳定。使用find()配合边界检查,防止无效迭代器操作。记住,set的操作时间复杂度为 $O(\log n)$,适合需要有序唯一元素的场景。遵循这些解决办法,能显著提升代码的健壮性。在实际开发中,多使用调试工具(如 GDB)检测潜在问题,并参考 C++ 标准库文档以掌握最佳实践。

2501_93897010的博客 326

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

int指针初始化_C++指针常见的一些坑

前沿C++指针C++指针的应用前面篇文章中我们介绍了C++指针的基本概念和基础应用,在程序编程的过程当中,最难使用的就是指针,如果使用不当,会给我们程序带来灾难性的。下面一起详解一下指针在使用时容易遇到的问题。1. 不要使用NULL指针NULL空指针是一个特殊的指针值,也是唯一一个对任何指针类型都合法的指针值。NULL指针表示它当时处于闲置状态,没有指向有意义的东西。其实,NULL ...

weixin_39605455的博客 355

C++初始化数组的几种常见方法(简单易懂无废话)

在 C++ 中,初始化数组有几种方式,具体取决于。初始化一维数组 使用列表初始化(推荐方式)使用部分初始化使用 初始化std::fill 使用循环初始化初始化二维数组 2.1 使用列表初始化初始化动态数组(使用 new) C++11 中的初始化方式(使用 std::array 和 std::vector)

喜欢分享工作中遇到的Bug和技术 5535

开源项目FTPClient-CPP常见问题解决方案

开源项目FTPClient-CPP常见问题解决方案 一、项目基础介绍 FTPClient-CPP 是一个简单的 C++ 编写的 FTP 客户端,它封装了 libcurl 库以进行 FTP 请求。该项目旨在提供一个便携且易于使用的 API,用于执行与 FTP 相关的操作。它已经过了多个编译器和平台的编译测试,包括 GCC、Microsoft Visual Studio 等。 主要编程语言 C++ ...

gitblog_00611的博客 940

C++语言99个常见编程错误 常见错误47:赋值与初始化混淆

常见错误47:赋值与初始化混淆  从技术视角看去,赋值和初始化没啥关系。它们之间泾渭分明,用在不同的场合。所谓初始化,就是把一段生鲜存储(raw storage)变成一个对象的过程。对于一个class对象来说,这会涵盖搭建一系列内部机能,以支持虚函数和虚基类,运行时类型信息以及其他类型相关信息。而赋值,则是在一个有着合适定义的对象的某种状态上所做的一个变换,是该对象处于一个新的状态,赋值操作不触及...

eyetired的博客 429

C++语言99个常见编程错误 常见错误56:直接与复制初始化

常见错误56:直接与复制初始化  标准允许编译器执行某种代码变换,去除这个临时对象的初始化和复制构造函数的调用,以产生和直接初始化一模一样的目标码。这是一个不平凡的优化,因为代码的实际行为改变了。大多数C++编译都会做代码变换,但标准并没有强制要求这么做。  代码变换需要了解编译器是在校验过原始代码的语义之后才实施变换的。  为了让代码更简单,更具可移植性,一个较佳的做法是在class对象,或“有...

eyetired的博客 424

【log4cpp】

提示:在使用中可以将log4cpp再度封装,减少重复代码 文章目录前言一、log4cpp是什么?二、安装步骤三、遇到问题的一些解决办法一、编译时找不到库二、运行时找不到库四、log4cpp码源阅读五、使用步骤1.引入库2.该做法存在问题测试效果:在这里插入图片描述 还有一个坑:对于有引用的成员初始化必须放进初始化列表里总结 前言 日志系统在整个系统架构中的重要性可以称得上基础的基础,但是这一点,都容易被大多数人所忽视。因为日志在很多人看来只是printf。在系统运行期间,是很难step by step.

weixin_45068173的博客 966

C++初始化列表:初始化顺序、性能开销与常见陷阱全解析

C++对象构造遵循“先初始化、后进入函数体”的底层机制。构造函数中为成员变量赋值的写法,往往隐藏着一次不必要的默认构造与赋值操作;而成员初始化列表能在对象创建阶段直接完成初始化,对const成员、引用成员、无默认构造函数的成员对象尤其关键。同时,初始化顺序由成员声明次序决定,而非列表书写顺序,理解这点有助于规避难以排查的随机值和编译错误。作为一种兼顾性能与正确性的编码方式,初始化列表广泛应用于资源管理类、网络配置对象等复杂工程场景,也是C++面试与代码评审中高频考察的基础能力。

weixin_42652674的博客 272
上一篇: UE管理内容 —— FBX Static Mesh Pipeline
下一篇: Nodes —— Utility
挨代码
博客等级 码龄5年 1696粉丝 384原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值