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

目录

摘要

1. 默认初始化(Default Initialization)

2. 值初始化(Value Initialization)

3. 直接初始化(Direct Initialization)

4. 拷贝初始化(Copy Initialization)

5. 列表初始化(List Initialization)

6. 聚合初始化(Aggregate Initialization)

7. 引用初始化(Reference Initialization)

8. 成员初始化列表(Member Initialization List)

9. 显式初始化(Explicit Initialization)

10. 延迟初始化(Lazy Initialization)

11. 常量初始化(Constant Initialization)

12. 静态初始化(Static Initialization)

引用


摘要

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

1. 默认初始化:未定义值或调用默认构造函数。
2. 值初始化:将变量初始化为零或调用默认构造函数。
3. 直接初始化:通过括号传递参数进行初始化。
4. 拷贝初始化:使用赋值运算符进行初始化。
5. 列表初始化:使用大括号进行初始化,避免窄化转换。
6. 聚合初始化:用于数组和 `struct` 等聚合类型的初始化。
7. 引用初始化:引用变量必须在声明时进行初始化。
8. 成员初始化列表:在类的构造函数中初始化成员变量。
9. 显式初始化:使用显式构造函数进行初始化。
10. 延迟初始化:在需要时才进行初始化。
11. 常量初始化:常量变量在编译时完成初始化。
12. 静态初始化:静态变量的初始化在程序启动时完成。

1. 默认初始化(Default Initialization)

默认初始化是指在声明变量时不提供初始值。对于内置类型变量,其值是未定义的;对于类类型变量,会调用其默认构造函数。

#include <iostream>class MyClass {
public:int x;MyClass() : x(0) {std::cout << "MyClass default constructor called\n";}
};int main() {int a;        // 未定义值MyClass obj;  // 调用 MyClass 的默认构造函数std::cout << "obj.x: " << obj.x << std::endl;  // 输出 0return 0;
}

2. 值初始化(Value Initialization)

值初始化会将变量初始化为零值。对于类类型,会调用其默认构造函数。

#include <iostream>class MyClass {
public:int x;MyClass() : x(0) {std::cout << "MyClass default constructor called\n";}
};int main() {int a = int();  // 初始化为 0MyClass obj = MyClass();  // 调用 MyClass 的默认构造函数std::cout << "a: " << a << std::endl;std::cout << "obj.x: " << obj.x << std::endl;return 0;
}

3. 直接初始化(Direct Initialization)

直接初始化通过括号传递参数进行初始化。

#include <iostream>class MyClass {
public:int x;MyClass(int val) : x(val) {std::cout << "MyClass(int) constructor called\n";}
};int main() {MyClass obj(10);  // 调用 MyClass(int) 构造函数std::cout << "obj.x: " << obj.x << std::endl;return 0;
}

4. 拷贝初始化(Copy Initialization)

拷贝初始化通过赋值运算符将初始值赋给变量,会调用拷贝构造函数或移动构造函数。

#include <iostream>class MyClass {
public:int x;MyClass(int val) : x(val) {std::cout << "MyClass(int) constructor called\n";}MyClass(const MyClass& other) : x(other.x) {std::cout << "MyClass copy constructor called\n";}
};int main() {MyClass obj1(10);  // 调用 MyClass(int) 构造函数MyClass obj2 = obj1;  // 调用拷贝构造函数std::cout << "obj1.x: " << obj1.x << std::endl;std::cout << "obj2.x: " << obj2.x << std::endl;return 0;
}

5. 列表初始化(List Initialization)

C++11引入了列表初始化,使用大括号 `{}` 进行初始化,可以避免窄化转换,并支持统一的初始化方式。

#include <iostream>class MyClass {
public:int x;MyClass(int val) : x(val) {std::cout << "MyClass(int) constructor called\n";}
};int main() {MyClass obj1{10};  // 调用 MyClass(int) 构造函数int a{5};          // 初始化为 5std::cout << "obj1.x: " << obj1.x << std::endl;std::cout << "a: " << a << std::endl;return 0;
}

6. 聚合初始化(Aggregate Initialization)

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

#include <iostream>struct MyStruct {int a;float b;
};int main() {MyStruct s1 = {1, 2.5f};  // 聚合初始化int arr[3] = {1, 2, 3};   // 数组的聚合初始化std::cout << "s1.a: " << s1.a << ", s1.b: " << s1.b << std::endl;std::cout << "arr: " << arr[0] << ", " << arr[1] << ", " << arr[2] << std::endl;return 0;
}

7. 引用初始化(Reference Initialization)

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

#include <iostream>int main() {int x = 10;int& ref = x;  // 引用初始化std::cout << "ref: " << ref << std::endl;ref = 20;std::cout << "x: " << x << std::endl;  // x 也会改变return 0;
}

8. 成员初始化列表(Member Initialization List)

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

#include <iostream>class MyClass {
public:int x;int y;MyClass(int a, int b) : x(a), y(b) {std::cout << "MyClass(int, int) constructor called\n";}
};int main() {MyClass obj(10, 20);  // 使用成员初始化列表std::cout << "obj.x: " << obj.x << ", obj.y: " << obj.y << std::endl;return 0;
}

9. 显式初始化(Explicit Initialization)

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

#include <iostream>class MyClass {
public:int x;explicit MyClass(int val) : x(val) {std::cout << "MyClass(int) constructor called\n";}
};int main() {MyClass obj1(10);  // 直接初始化// MyClass obj2 = 10;  // 错误:不能进行隐式转换std::cout << "obj1.x: " << obj1.x << std::endl;return 0;
}

10. 延迟初始化(Lazy Initialization)

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

#include <iostream>
#include <memory>class MyClass {
public:MyClass() {std::cout << "MyClass constructor called\n";}void doSomething() {std::cout << "Doing something\n";}
};int main() {std::unique_ptr<MyClass> ptr;  // 声明但不初始化// ...if (!ptr) {ptr = std::make_unique<MyClass>();  // 在需要时初始化}ptr->doSomething();return 0;
}

11. 常量初始化(Constant Initialization)

常量初始化用于初始化 `const` 变量,在编译时完成。

#include <iostream>const int a = 10;  // 常量初始化int main() {std::cout << "a: " << a << std::endl;return 0;
}

12. 静态初始化(Static Initialization)

静态变量的初始化,分为零初始化和常量初始化,在程序启动时完成。

#include <iostream>class MyClass {
public:static int count;static const int constant;
};int MyClass::count = 0;  // 静态初始化
const int MyClass::constant = 42;  // 常量初始化int main() {std::cout << "MyClass::count: " << MyClass::count << std::endl;std::cout << "MyClass::constant: " << MyClass::constant << std::endl;return 0;
}

引用

Initialization - cppreference.com

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

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

相关文章

【C语言之排序】-------六大排序

作者主页&#xff1a;作者主页 数据结构专栏&#xff1a;数据结构 创作时间 &#xff1a;2024年5月18日 前言&#xff1a; 今天我们就给大家带来几种排序的讲解&#xff0c;包括冒泡排序&#xff0c;插入排序&#xff0c;希尔排序&#xff0c;选择排序&#xff0c;堆排序&…

揭秘成都跃享未来教育:安全靠谱,打造教育新未来?

在当今这个信息爆炸的时代&#xff0c;教育行业的变革日新月异&#xff0c;各种教育机构如雨后春笋般涌现。其中&#xff0c;成都跃享未来教育咨询有限公司以其独特的教育理念和创新的教学模式&#xff0c;吸引了众多家长和学生的目光。那么&#xff0c;这家公司到底安不安全&a…

湖南(广告效果测评)源点调研 广告对消费者行为的影响效果

湖南&#xff08;市场调研&#xff09;源点咨询认为&#xff1a;调查在市场中是一个万万不可忽视的环节。 产品在问世之前要认真地调查&#xff0c;广告在投放之前也要认真地调查。由于广告实质是商家和消费者沟通的一个过程&#xff0c;所以在广告投放前&#xff0c;商家就应…

【AOP】ASP.NET Core中各种Filter(拦截器)

在ASP.NET Core中&#xff0c;Filter&#xff08;过滤器&#xff09;是一种强大的机制&#xff0c;允许你在请求处理管道中的特定阶段运行代码。这些过滤器提供了在请求的不同阶段执行逻辑的能力&#xff0c;比如授权、日志记录、异常处理等。ASP.NET Core 提供了多种类型的过滤…

Spark中把所有的列转换成string操作

##事例代码 from pyspark.sql.functions import col df.select(*[col(c).cast("string").alias(c) for c in df.columns]) 这段代码使用了Spark SQL中的select函数和列表推导式来选择DataFrame中的所有列&#xff0c;并将它们的数据类型转换为字符串类型。 select(*…

案例分享:需求管理工具Jama Connect助力某财富100强的半导体巨头缩短项目周期、降低开发成本,提高需求复用率及可追溯性

案例分享&#xff1a;作为全球领导者&#xff0c;该财富100强公司以扩大其在移动技术领域的领导力和影响力为使命&#xff0c;该领域是其行业中增长最快的细分市场。公司有超过2,100名工程师、设计师和利益相关者通过使用Jama Connect加速产品开发。 成果概述&#xff1a; •…

数据新生态:Web3如何重新定义个人数据权利

随着数字化时代的不断深入&#xff0c;个人数据已经成为了现代社会中最宝贵的资源之一。然而&#xff0c;传统互联网时代下&#xff0c;个人数据往往被大型科技公司垄断、滥用&#xff0c;个人数据权利常常受到侵犯。而随着Web3技术的崛起&#xff0c;人们开始期待一种全新的数…

zynq固化问题

zynq固化&#xff0c;sd卡如果没有用gpio那么这个地方不能选 另外ddr型号一定要选对&#xff0c;不同的容量不一样

即时设计工具对决:Figma、Sketch与XD的优劣比较

最近几年&#xff0c;UI 设计工具出现了许多后起之秀&#xff0c;其中有四款更具代表性的UI设计软件&#xff1a;Sketch、Adobe XD、Figma 和 即时设计&#xff0c;这四个设计软件都有自己的优势。如果合作对您的UI设计过程至关重要&#xff0c;那么Figma 和 即时设计 它应该是…

React中常见的面试题

本文是结合实践中和学习技术文章总结出来的笔记(个人使用),如有雷同纯属正常((✿◠‿◠)) 喜欢的话点个赞,谢谢! 1. 约束性组件与非约束性组件 1.1. 非约束性组件 非约束性组件其实就是不能控制状态的组件,比如: <input type"text" defaultValue"123&qu…

JSP与Servlet的区别

一、技术难点 本质与结构&#xff1a; JSP&#xff08;Java Server Pages&#xff09;在本质上可以被视为一种特殊的Servlet。但两者的创建方式和结构存在显著差异。Servlet完全由Java程序代码构成&#xff0c;擅长于流程控制和事务处理&#xff1b;而JSP则是由JSP容器执行页面…

python身份证ocr接口功能免费体验、身份证实名认证接口

翔云人工智能API开放平台提供身份证实名认证接口、身份证识别接口&#xff0c;两者的相结合可以实现身份证的快速、精准核验&#xff0c;当用户在进行身份证实名认证操作时&#xff0c;仅需上传身份证照片&#xff0c;证件识别接口即可快速、精准的对证件上的文字信息进行快速提…

腾讯云centos上安装docker

下面的操作是在root用户下操作的,如果非root用户在命令行前加上sudo 1. 系统及内核查看 操作系统&#xff1a;64位的CentOS 7或更新版本。内核版本&#xff1a;最低要求是3.10&#xff0c;推荐使用3.10或更高版本。 #查看内核版本 (base) [klfwjfweaVM-0-6-centos ~]$ uname…

rk3568定时器

前言 本文记录的是用rk3568开发板做定时器实验 1 定时器理论知识 1.1系统节拍 在linux的kernel路径中,输入: make ARCH=arm64 menuconfig // 在内核路径下执行打开配置界面 选中“Timer frequency”,打开以后如图所示: 从图 14.1.1.1 可以看出,可选的系统节拍率为 100…

对i += i -i和i = i - 1的理解

i i & -i迭代的结果是每次加i的最低次&#xff0c;直到加到与i最近的2的次幂。 比如&#xff0c;初始i是65&#xff0c;迭代的i的值如下&#xff1a;66&#xff0c; 68&#xff0c; 72&#xff0c; 80&#xff0c; 96&#xff0c;128&#xff0c; 256&#xff0c; 512 ..…

派派派森03

1.JSON数据 Python数据和Json数据的相互转化 # 导入json模块 import json#准备符合json格式要求的python数据 data [{"name": "老王", "age": 16}, {"name": "张三", "age": 20}]# 通过json.dump(data)方法把pyt…

配置无密码 sudo

配置无密码 sudo 需要谨慎操作&#xff0c;因为这会给你的系统安全带来一定的风险。在决定这么做之前&#xff0c;请确保你了解潜在的安全后果。以下是具体操作步骤&#xff1a; 步骤1: 使用 visudo 编辑 sudoers 文件 visudo 是一个命令行工具&#xff0c;它用于安全地编辑 …

黑龙江等保测评有哪些内容?

与等保1.0相比&#xff0c;新的等保2.0版本有了很大的变化&#xff0c;评估的内容、评估的标准也有了很大的差异。那么新版的《等保2.0》实施后&#xff0c;我们要测试什么&#xff1f; 等保测评首先是有十个大项&#xff0c;安全物理环境&#xff0c;安全区域边界&#xff0c;…

(echarts)图上数值显示单位

&#xff08;echarts&#xff09;图上数值显示单位 series: [{name: 比例,type: bar,...label: {show: true,position: top,formatter: (params) > params.value % //图上数值显示格式},tooltip: { //鼠标移入图上数值显示格式valueFormatter: function(value) {return val…

mysql解决深度分页的问题

limit深分页为什么会变慢&#xff1f; 例如&#xff1a;一条sql&#xff1a; select id,name,age, from user where age >10 limit (10000,10); 首先这条sql肯定是比较慢的&#xff0c;因为它经过了很多次的回表。 sql执行流程&#xff1a; 1&#xff1a;先通过普通索引…