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++初始化类-CSDN博客

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 };
( other )

( 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

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

五,列表初始化(List Initialization)

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

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

Syntax

Direct-list-initialization

T object { arg1, arg2, ... };
{ 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, ... }
({ arg1, arg2, ... })
Class { T member = { arg1, arg2, ... }; };
int main() {int a{5};         //初始化为 5MyClass 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 = {} ;

{} ; (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;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/459967.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[机器学习]集成学习

1 集成学习 强强联合、弱弱变强Bagging&#xff08;平权投票&#xff09;&#xff1a;随机森林Boosting&#xff08;加权投票&#xff09;&#xff1a;Adaboost、GBDT、XGBoost、LightGBM 2 随机森林 3 Adaboost 放大错误数据&#xff0c;缩小正确数据

第三十三篇:TCP协议如何避免/减少网络拥塞,TCP系列八

一、流量控制 一般来说&#xff0c;我们总是希望数据传输得更快一些&#xff0c;但是如果发送方把数据发送得太快&#xff0c;接收方可能来不及接收&#xff0c;造成数据的丢失&#xff0c;数据重发&#xff0c;造成网络资源的浪费甚至网络拥塞。所谓的流量控制&#xff08;fl…

在Excel中如何快速筛选非特定颜色

Excel中的自动筛选是个非常强大的工具&#xff0c;不仅可以筛选内容&#xff0c;而且可以筛选颜色&#xff0c;例如筛选A列红色单元格。但是有时希望筛选除了红色之外的单元格&#xff08;下图右侧所示&#xff09;&#xff0c;其他单元格的填充色不固定&#xff0c;有几种颜色…

数据结构---链表(一)【不带头单向非循环】

文章目录 链表概念链表的使用LinkedList 的几种遍历方式单链表的模拟实现&#xff08;不带头&#xff09;链表面试题 观察ArrayList 顺序表的源码发现&#xff0c;底层是使用数组实现的。由于其底层是一段连续空间&#xff0c;当在ArrayList任意位置插入或者删除元素时&#xf…

Pytorch(一)

一.PyTorch环境配置及安装 1.1 工具安装 1.1.1 Anaconda下载 清华大学镜像站下载&#xff0c;版本为Anaconda3-5.2.0-Windows-x86_64&#xff08;对应python3.6.5&#xff09; Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 1.1.2…

关于我的数据结构与算法——初阶第二篇(排序)

&#xff08;叠甲&#xff1a;如有侵权请联系&#xff0c;内容都是自己学习的总结&#xff0c;一定不全面&#xff0c;仅当互相交流&#xff08;轻点骂&#xff09;我也只是站在巨人肩膀上的一个小卡拉米&#xff0c;已老实&#xff0c;求放过&#xff09;。 排序的概念及其运…

AI驱动的低代码未来:加速应用开发的智能解决方案

引言 随着数字化转型的浪潮席卷全球&#xff0c;企业对快速构建应用程序的需求愈发强烈。然而&#xff0c;传统的软件开发周期冗长、成本高昂&#xff0c;往往无法满足快速变化的市场需求。在此背景下&#xff0c;低代码平台逐渐成为开发者和企业的优选方案&#xff0c;以其“低…

三周精通FastAPI:21 子依赖项和路径操作装饰器依赖项

官方文档&#xff1a;https://fastapi.tiangolo.com/zh/tutorial/dependencies/sub-dependencies/#_6 子依赖项 FastAPI 支持创建含子依赖项的依赖项。 并且&#xff0c;可以按需声明任意深度的子依赖项嵌套层级。 FastAPI 负责处理解析不同深度的子依赖项。 第一层依赖项 …

模具生产管理系统软件:提升制造业效率的新利器

引言 我们都知道&#xff0c;企业面临着提高生产效率、降低成本和提升产品质量的压力。模具生产作为制造过程中至关重要的一环&#xff0c;如何有效管理和优化模具生产过程&#xff0c;成为企业关注的重点。模具生产管理系统应运而生&#xff0c;能够为企业提供实时监控、流程…

MySQL中,如何定位慢查询?定位到的慢SQL如何分析?

目录 1. 慢查询发生的场景&#xff1f; 2. MySQL中&#xff0c;如何定位慢查询&#xff1f; 2.1 详细解释 3. 定位到的慢SQL如何分析&#xff1f; 3.1 详细说明 1. 慢查询发生的场景&#xff1f; 2. MySQL中&#xff0c;如何定位慢查询&#xff1f; 介绍一下当时产生问题…

「C/C++」C++ 设计模式 之 单例模式(Singleton)

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

华为云开源项目Sermant正式成为CNCF官方项目

近日&#xff0c;云原生计算基金会&#xff08;CNCF&#xff09;正式接纳由华为云发起的云原生无代理服务网格项目Sermant。Sermant的加入&#xff0c;极大地丰富了云原生微服务治理技术的探索、创新和发展&#xff0c;为CNCF社区注入了新的活力。 Sermant是华为云在微服务治理…

用sdcc给51单片机编译C程序

学习单片机大部分人用的是Keil uVision&#xff0c;虽然好用&#xff0c;可大部分人用的是盗版&#xff0c;其实单片机程序小的话&#xff0c;完全可以用文本编辑器&#xff08;推荐notepad)编写&#xff0c;然后用免费的sdcc来编译&#xff0c;下面介绍一下大致的过程。 sdcc…

Ajax:表单 模板引擎

Ajax&#xff1a;表单 & 模板引擎 form 表单form 属性 Ajax操控表单事件监听阻止默认行为收集表单数据 模板引擎art-template{{}}语法原文输出条件输出循环输出过滤器 原理 form 表单 在HTML中&#xff0c;可以通过<form>创建一个表单&#xff0c;收集用户信息。而采…

【水下生物数据集】 水下生物识别 深度学习 目标检测 机器视觉 yolo(含数据集)

一、背景意义 随着全球海洋生态环境的日益变化&#xff0c;水下生物的监测和保护变得愈发重要。水下生物种类繁多&#xff0c;包括螃蟹、鱼类、水母、虾、小鱼和海星等&#xff0c;它们在海洋生态系统中扮演着关键角色。传统的水下生物监测方法通常依赖于人工观察&#xff0c;效…

[vulnhub]Kioptrix: Level 1.2 (#3)

https://www.vulnhub.com/entry/kioptrix-level-12-3,24/ 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的&#xff0c;所以靶机IP是169 nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-29 13:16 CST …

TVM前端研究--Relay

文章目录 深度学习IR梳理1. IR属性2. DL前端发展3. DL编译器4. DL编程语言Relay的主要内容一、Expression in Relay1. Dataflow and Control Fragments2. 变量3. 函数3.1 闭包3.2 多态和类型关系3.3. Call4. 算子5. ADT Constructors6. Moudle和Global Function7. 常量和元组8.…

Ubuntu UFW防火墙规则与命令示例大全

在服务器安全领域&#xff0c;防火墙是守护网络安全的坚实盾牌。UFW&#xff08;Uncomplicated Firewall&#xff09;&#xff0c;即“不复杂的防火墙”&#xff0c;是一个运行在iptables之上的防火墙配置工具&#xff0c;它为Ubuntu系统默认提供了一个简洁的命令行界面&#x…

Linux高阶——1026—验证内存映射mmap函数使用

1、验证共享映射后修改文件内容&#xff0c;是否能够同步 先创建一个映射文件&#xff0c;写入数据 分为四个步骤 1、打开映射文件 设文件描述符&#xff0c;使用open函数 int fd; if((fdopen("mapfile",O_RDWR))-1) { perror("open failed");exit…

从零开始的 vue项目部署到服务器详细步骤(vue项目build打包+nginx部署+配置ssl证书)

从零开始的 vue项目部署到服务器详细步骤&#xff08;vue项目build打包nginx部署配置ssl证书&#xff09; 文章目录 从零开始的 vue项目部署到服务器详细步骤&#xff08;vue项目build打包nginx部署配置ssl证书&#xff09;一、前言二、vue项目部署前配置1、vite.config.js 增加…