C++中对变量进行初始化的3种方法

news2024/11/29 2:45:23

      1.用"=":copy initialization,这种初始化形式是从C继承的。此种方式(拷贝初始化)的初始化在现代C+中已不再受欢迎,因为对于某些复杂类型来说,此种方式初始化的效率低于其它形式的初始化。
      每当隐式拷贝或转换值时,也会使用拷贝初始化,例如按值将参数传递给函数、按值从函数返回或按值捕获异常时。

      2.构造函数初始化:通过括号(parentheses)提供值来声明变量。构造函数初始化和旧的普通初始化方式(=)的区别在于,它总是返回括号中的最后一个值,无论它的大小或符号是什么。
      direct initialization:就像拷贝初始化一样,直接初始化在现代C++中已经不再受欢迎,很大程度上是因为被列表初始化所取代。然而,我们现在知道列表初始化有其自身的一些怪癖,因此直接初始化在某些情况下再次得到使用。
      当值显式转换为另一种类型时,也会使用直接初始化。
      直接初始化不受欢迎的原因之一是它使得很难区分变量和函数:

int x();  // forward declaration of function x
int x(0); // definition of variable x with initializer 0

      3.统一初始化(list initialization or uniform initialization or brace initialization):C++中初始化对象的现代方法用大括号代替括号(curly braces instead of parentheses)。与构造函数初始化不同,此赋值方法只能采用大括号中的一个值,提供多个值将返回编译错误。
      列表初始化还有一个额外的好处:列表初始化中的"缩小转换(narrowing conversions,是隐式转换)"格式不正确。这意味着,如果你尝试使用变量无法安全保存的值来初始化变量,则编译器需要生成诊断信息(通常是错误)。
      拷贝和直接初始化只会删除小数部分,从而导致值初始化为可变宽度。你的编译器可能会选择性地警告你这一点,因为很少希望丢失数据。但是,通过列表初始化,编译器需要在这种情况下生成诊断。
      你可以在通常进行初始化的任何地方使用大括号初始化,例如,作为函数参数或返回值,或者与new关键字一起使用。
      Value initialization and zero initialization: 当使用空大括号初始化变量时,将进行值初始化。在大多数情况下,值初始化会将变量初始化为零(或空,如果这更适合给定类型)。在发生归零的情况下,这称为归零初始化。
      什么时候应该使用{0}和{}进行初始化
      (1).如果你实际使用该值,请使用显式初始化值。
      (2).如果值是临时的并且将被替换,请使用值初始化。

      优先选择直接列表初始化(或值初始化)来初始化变量

      以下为测试代码,进行了描述说明

int test_variables_init()
{
	int val; // no initializer(default initialization): 在大多数情况下,默认初始化不执行初始化,并且使变量具有不确定的值


	// 1.using "="
	int val1 = 1; // copy initialization: 这种初始化形式是从C继承的
	std::cout << "val1:" << val1 << "\n"; // val1:1


	// 2.constructor initialization: parentheses
	int val2(2); // direct initialization
	std::cout << "val2:" << val2 << "\n"; // val2:2

	int val3 = (3);
	std::cout << "val3:" << val3 << "\n"; // val3:3

	// 构造函数初始化和旧的普通初始化方式(=)的区别在于,它总是返回括号中的最后一个值,无论它的大小或符号是什么
	int val4 = (4, 5, 6, 7, -8);
	std::cout << "val4:" << val4 << "\n"; // val4:-8


	// 3.uniform initialization: curly braces
	int val5{ 9 }; // direct list initialization
	std::cout << "val5:" << val5 << "\n"; // val5:9

	int val6 = { 10 }; // copy list initialization
	std::cout << "val6:" << val6 << "\n"; // val6:10

	// 与构造函数初始化不同,统一初始化方法只能采用大括号中的一个值,提供多个值将返回编译错误
	//int val7 = { 11, 12 }; // error C2440: "初始化": 无法从"initializer list"转换为"int"

	int val8{}; // value initialization
	int val12{ 0 }; // explicit initialization to value 0
	std::cout << "val8:" << val8 << "\n"; // val8:0

	// 列表初始化中的"缩小转换(narrowing conversions)"格式不正确
	//int val9{ 4.5 }; // error C2397: 从"double"转换到"int"需要收缩转换
	int val10 = 4.5; // warning C4244: "初始化": 从"double"转换到"int",可能丢失数据
	int val11(4.5); // warning C4244: "初始化": 从"double"转换到"int",可能丢失数据

	return 0;
}

      执行结果如下图所示:

      GitHub:https://github.com/fengbingchun/Messy_Test

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

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

相关文章

【c语言】c语言转义字符详解

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;c语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

如何将OpenAI Sora生成的普通AI视频转化为Vision Pro的空间视频,沉浸式体验

【基于AI的Vision Pro空间视频】工作流:这个工作流程用于将2D视频转换为适用于 Vision Pro的Spatial视频: 1、使用Deep3D将2D视频转换为3D SBS: 使用Deep3D工具将2D视频转换为3D SBS格式: 转换例子:Prediction– lucataco/deep3d – Replicatehttps://replicate.com/…

文件上传之大文件分块上传之断点续传操作

断点续传概念&#xff1a; 断点续传是一种网络的传输机制&#xff0c;用于在文件传输过程中出现中断或错误时&#xff0c;能够恢复传输而不必重新开始&#xff0c;它解决了网络不稳定连续中断或大文件传输时时间过长等问题。提高了文件传输时可靠和效率性。 断点续传需求&…

浅谈js事件机制

事件是什么&#xff1f;事件模型&#xff1f; 原始事件模型&#xff08;DOM0级&#xff09; HTML代码中指定属性值&#xff1a;在js代码中指定属性值&#xff1a;优点&#xff1a;缺点&#xff1a; IE 事件模型DOM2事件模型 对事件循环的理解 宏任务&#xff08;Macrotasks&…

【Linux】软件包管理器 yum | vim编辑器

前言: 软件包管理器 yum和vim编辑器讲解 文章目录 软件包管理器 yum编辑器-vim四种模式普通模式批量化注释和批量化去注释末行模式临时文件 软件包管理器 yum yum&#xff08;Yellowdog Updater, Modified&#xff09;是一个在基于 RPM&#xff08;管理软件包的格式和工具集合&…

电影《社交网络》带来的深层次的思考

《社交网络》是由大卫芬奇执导&#xff0c;杰西艾森伯格、安德鲁加菲尔德、贾斯汀汀布莱克等主演的剧情片&#xff0c;于2010年10月8日在美国上映。该片讲述了马克扎克伯格和埃德华多萨瓦林两人如何建立和发展Facebook的故事。 学习关键点&#xff1a; 创业精神&#xff1a;电…

C++opencv图像算数操作-加减乘除

quick_opencv.h #include<opencv2\opencv.hpp> using namespace cv; class QuickDemo{public:void operators_demo(Mat &image);//图像算数操作 };QuickDemo.cpp #include<quick_opencv.h>//图像算数操作 void QuickDemo::operators_demo(Mat &image) {M…

八、计算机视觉-边界填充

文章目录 前言一、原理二、具体的实现 前言 在Python中使用OpenCV进行边界填充&#xff08;也称为zero padding&#xff09;是一种常见的图像处理操作&#xff0c;通常用于在图像周围添加额外的像素以便进行卷积或其他操作。下面是使用OpenCV进行边界填充的基本原理和方法 一…

解决elementUI固定列后,下方多了一条横线的问题

最近遇到一个bug,如下图,el-table的操作列使用fixed属性固定后,下方多了一条横线: 我们将样式设置高优先,以覆盖内联样式,如下是less里使用穿透样式解决的办法: <style lang="less" scoped> /deep/ .el-table__fixed-right {height: 100

vulvhub-----Hacker-KID靶机

打靶详细教程 1.网段探测2.端口服务扫描3.目录扫描4.收集信息burp suite抓包 5.dig命令6.XXE漏洞读取.bashrc文件 7.SSTI漏洞8.提权1.查看python是否具备这个能力2.使用python执行exp.py脚本&#xff0c;如果提权成功&#xff0c;靶机则会开放5600端口 1.网段探测 ┌──(root…

用户中心 -- 快捷键使用

一、后端&#xff0c;软件 idea 1.1 代码如何写出 网址&#xff1a;用户管理 --汇总 -- 明细-CSDN博客 1.2 一键调整代码格式的快捷键 网址&#xff1a; 用户管理第2节课 -- idea 2023.2 创建表--【本人】-CSDN博客

OpenCV DNN 活体检测项目环境配置等各阶段tips

date: 2020-09-22 14:53 资料来源《OpenCV深度学习应用与性能优化实践》第八章。 在复现这个项目的时候发现一些可以调整的小tips。 环境配置阶段 使用conda 创建python 工作环境时&#xff0c;注释掉requirems.txt 里的opencv-python-inference-engine4.1.2.1&#xff0c;安…

php美女写真视频管理源码 PHPCMS视频写真管理系统源码

国内首家CMS视频写真管理系统&#xff01; 三大模块&#xff0c;视频模块&#xff0c;图片模块&#xff0c;资讯模块。 全方面解决了多元素运营方案。采用CI框架核心开发&#xff0c;体积小、运行快&#xff0c;强大缓存处理。 视频采用了云转码服务将不同的视频来源、不同的…

强化学习(TD3)

TD3——Twin Delayed Deep Deterministic policy gradient 双延迟深度确定性策略梯度 TD3是DDPG的一个优化版本&#xff0c;旨在解决DDPG算法的高估问题 优化点&#xff1a; ①双重收集&#xff1a;采取两套critic收集&#xff0c;计算两者中较小的值&#xff0c;从而克制收…

KMS密钥管理有哪些安全功能

KMS(Key Management Service)密钥管理服务是一种专门用于管理和保护加密密钥的系统。在现代的信息安全领域中&#xff0c;密钥的重要性不言而喻&#xff0c;它是确保数据加密、解密以及身份验证等安全操作的核心要素。KMS的出现&#xff0c;极大地提高了密钥管理的效率和安全性…

跨境云手机如何简化tiktok运营流程

如今&#xff0c;tiktok已经成为世界范围内都非常流行的社交媒体平台。然而在大多数情况下&#xff0c;由于网络原因&#xff0c;tiktok无法在国内使用&#xff0c;但依然有越来越多的人注册tiktok号码、建立tiktok矩阵。原因是tiktok仍然有大量的流量可供商业使用&#xff0c;…

CSP-201812-1-小明上学

CSP-201812-1-小明上学 解题思路 #include <iostream> using namespace std; int main() {int red, yellow, green, n, timeSum 0;cin >> red >> yellow >> green;cin >> n;for (int i 0; i < n; i){int flag, time;cin >> flag &g…

Spark---环境搭建---入门概念

目录 环境搭建 测试 Apache Spark是用于大规模数据处理的统一分析引擎&#xff1b; spark 仅仅替代了hadoop的mapraduce&#xff1b; spark比hadoop快一百倍&#xff1b; 环境搭建 1&#xff1a;解压&#xff1b; 2&#xff1a;配置spark环境变量&#xff1a; vim /etc/pro…

WouoUI-PageVersion 一个用于快速构建具有丝滑OLED_UI动画的项目

WouoUI-PageVersion 写在前面 简介&致谢 Air001的TestUI例子的b站的演示视频 Air001的LittleClock例子的b站演示视频: https://www.bilibili.com/video/BV1J6421g7H1/ Stm32的TestUI例子的b站演示视频: https://www.bilibili.com/video/BV1mS421P7CZ/ 所有演示的工程文…

【6-1】使用hanlp进行实体抽取以及句法分析(问题待解决)

1.使用hanlp抽取法人名称、企业名称等信息 # -*- coding: utf-8 -*- from pyhanlp import *text1"1998年11月11日&#xff0c;马化腾和同学张志东在广东省深圳市正式注册成立“深圳市腾讯计算机系统有限公司”&#xff0c;之后许晨晔、陈一丹、曾李青相继加入。当时公司…