外贸网站的作用有哪些/seo上海培训

外贸网站的作用有哪些,seo上海培训,淮安涟水网站建设,营销网站建设设计目录 前言 1.初始化列表 2.std::initializer_list 3.auto 4.decltype 5.nullptr 6.左值引用和右值引用 6.1右值引用的真面目 6.2左值引用和右值引用比较 6.3右值引用的意义 6.3.1移动构造 6.4万能引用 6.5完美转发——forward 结语 前言 C,这门在系统…

目录

前言

1.初始化列表

2.std::initializer_list

3.auto

4.decltype

5.nullptr

6.左值引用和右值引用 

6.1右值引用的真面目

6.2左值引用和右值引用比较

6.3右值引用的意义

6.3.1移动构造

6.4万能引用

6.5完美转发——forward

结语


前言

  C++,这门在系统开发、游戏开发、嵌入式等众多领域都占据主导地位的编程语言,一直在不断进化。C++11就像是C++家族中的一颗璀璨明星,闪耀着无数令人惊叹的新特性。如果你还在使用传统的C++编码方式,那你可能正在错过许多现代编程的便捷与高效。想象一下,用更少的代码编写出性能更高的程序,轻松应对复杂的并发场景,还能享受更加简洁和安全的内存管理。C++11就能让这一切成为现实。在这篇博文中,我会一点点揭开C++11新特性的神秘面纱,让你看到C++在这次重大更新之后所蕴含的无限潜力。


1.初始化列表

在C++98标准中,允许使用 花括号{ } 对数组或者结构体元素进行统一的列表初始化

例如:

struct Point{int a;int b;
};int main(){int arry[] = {1,2,3,4};//数组初始化Point p = {1,2};//结构体初始化return 0;
}

而C++11扩大了使用 花括号{ } 进行初始化的使用范围,使其可以用于所有的内置类型和用户自定义的类型

//对数组初始化
int arry1[]{1,2,3,4,5};
//对内置类型初始化
int x{9};
//对用户自定义类型初始化
Point p{9,9};
//对vector容器对象进行初始化
vector<int> vec = {1,2,3,4,5,6,7,8,9};

注意:

使用初始化列表时,可以添加等号 " = ",也可以不添加

2.std::initializer_list

initializer_list是什么?

看名字像一个容器,但我们学过的容器并没有这个,但并非没有见过

但C++11支持对各个容器进行初始化列表初始化,离不开它

std::initializer_list 是一个轻量级的模板类,用于在函数参数中传递初始化列表,从而使编译器能够正确解析和处理使用花括号 {} 进行初始化的对象。

我们在诸多容器的构造中,都可以看见它是身影

在vector构造中

在list构造中 

std::initializer_list 是定义在 <initializer_list> 头文件中的一个模板类,用于表示一个初始化列表。

它的基本形式如下:

std::initializer_list<T> init_list = { /* 初始化元素 */ };

std::initializer_list 提供了一种轻量级的、只读的视图来访问初始化列表中的元素。它常用于构造函数、函数参数以及返回类型,以支持统一初始化语法。

并不是所有的类型都会有std::initializer_list的构造函数,也并不是有std::initalizer_list才能使用花括号 { } 进行初始化

但只要你显式写了使用std::initializer_list的构造函数,则进行{ }初始化时,会优先调用该函数进行初始化

关于initializer_list的细节不过多赘述,知道有这个东西,和它的大致用途即可

3.auto

在C++98中auto是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以auto没有什么价值

C++11废弃auto的原本用法,将其用于实现自动类型推断,这一功能极大地简化了代码编写,特别是在处理复杂类型时。

举个例子:

当一个类型很复杂时,可以使用auto进行简写

std::pair<int, std::string> get_user_info() {return {42, "Alice"};
}int main() {// 使用 auto 简化返回类型的声明auto user = get_user_info();reutrn 0;
}

4.decltype

在C++11标准中,decltype 是一个新增的关键字,用于在编译时推导表达式的类型。与 auto 关键字类似,decltype 也用于类型推导,但两者的工作机制和应用场景有所不同。

decltype 的基本语法

decltype(expression) variable_name;

说明: 

  • expression 是任何有效的C++表达式,decltype 会根据这个表达式的类型来推导出 variable_name 的类型。

示例:

int a = 5;
double b = 3.14;
decltype(a) c = a; // c 的类型为 int
decltype(b+b) d = b; // b+b表达式的结果类型为double,则b的类型为 double

注意:

decltype 不会实际计算表达式的值,它只在编译时进行类型推导。

5.nullptr

由于C++中的NULL被定义为字面量0,但这样可能会带来一些问题

因为 NULL 既能表示指针常量,又能表示整形常量

出于清晰和安全的考虑,C++11新增了nullptr,用于表示空指针

6.左值引用和右值引用 

传统的C++语法中就有引用的语法,而C++11中新增了的右值引用的语法特性

现在,引用就分为两种

  1. 左值引用
  2. 右值引用

什么是左值,什么是左值引用?

左值是一个表示数据的表达式,如变量名、指针等

左值一般出现在赋值符号的左边

//下面的指针p ,变量b、c 均为左值
int* p = new int(0);
int b =1;
const int c =2;

左值引用就是给左值的引用,给左值取别名

int*& rp = p;
int& rb = b;
const int& rc = c;

注意:

左值引用的类型一定是 左值类型+& ,必须严格匹配

什么是右值?什么是右值引用

右值也是一个表示数据的表达式,如字面常量、表达式返回值、函数返回值等等

右值只能出现在赋值符号的右边

//常见右值
10;//常量
x+y;//表达式
add(x,y)//函数返回值

右值引用就是对右值的引用,给右值取别名

int&& rr1=10;
double&& rr2 = x + y;
double&& rr3 = fmin(x,y);

右值是不能取地址的,但给右值取别名后,会导致右值被存储到特定的位置(一般是栈区),且可以取到该位置的地址

也就是说:不能取字面量10的地址,但rr1引用后,可以对rr1取地址,也可以修改rr1

误区:

习惯使用左值引用后

我们对右值引用也会有一个误解:可以通过修改右值引用来修改右值

这是不切实际的,我们修改的从来只是右值引用,而并非右值!

如上面的rr1,令rr1 = 11,并不会让 10 = 11!

巧记

  1. 区分左值和右值:左值在 赋值操作符的左边,右值在 赋值操作符的右边
  2. 区分左值引用和右值引用:左值引用是 类型+&,右值引用是 类型+&&

6.1右值引用的真面目

右值不能被修改,这是公认的,例如 10 永远不可能变成 11

但为什么被引用后,就可以被修改?10不是在常量区吗?难道被移到栈区了?

右值引用一个右值,右值本身并没有被“移动”到某个新的区域,而是右值引用的变量本身存储了右值的内容

具体来说:

  • 右值引用的变量:右值引用本身是一个左值,它有自己的存储位置(通常是栈上的某个位置)。这个变量存储了右值的内容
  • 右值的原始位置:右值的本身的原始位置(如字符常量存储在常量区)并不会因为右值引用而改变变。右值引用只是提供了一个访问右值内容的途径

右值引用的真面目——左值,左值可以被取地址,非const左值可以被修改

6.2左值引用和右值引用比较

左值引用总结:

  1. 左值引用不能引用左值,但不能引用右值
  2. const 左值引用可以引用左值,也可以引用右值

右值引用总结:

  1. 右值引用可以引用右值,不能引用左值,但可以引用move后的左值

6.3右值引用的意义

const 左值引用既可以引用左值又可以引用右值,那为什么C++11还要提出右值引用呢?

是不是画蛇添足?

并不是,左值引用在一起场景下存在短板,而右值引用恰恰能解决这个短板

举个例子:

先今,我们自定义了一个string类

该类中有一个拷贝构造函数,并在类外定义了一个to_string函数

两者造型如下:

to_string函数

​​​​​​bit::string to_string(int value) {bit::string str;//return str;
}

string的拷贝构造函数

string(const string& s) : _str(nullptr) 
{        std::cout << "MyString(const MyString& s) -- 深拷贝" << std::endl;string tmp(s.str);swap(tmp);    
}

用to_string的返回值去构造一个string对象

 

这就体现左值引用的短板了

当函数返回对象是一个局部对象,出了函数作用域就不存在了,就会调用拷贝构造创建一个新的临时对象,再用这个临时对象去拷贝构造

一共会发生两次拷贝构造,其中,创建临时对象的时候,涉及开辟新的空间

开辟新空间,很浪费资源,太多次受不了

6.3.1移动构造

有没有什么简单,且不吃操作的方法规避深拷贝

有的,兄弟,有的

to_string的返回值是一个右值,用这个右值构造ret2,如果没有移动构造,调用就会匹配调用拷贝构造,因为const左值引用是可以引用右值的,这里就是一个深拷贝

此时我们在bit::string中增加一个移动构造,就是用右值引用充当形参

具体造型如下

//移动构造
string(string&& s)
:_str(nullptr)
,_size(0)
,_capacity(0)
{swap(s);
}

此时再次构造ret2,如果既有拷贝构造,又有移动构造,则会调用更为匹配的移动构造

而移动构造中没有新开空间,拷贝数据,效率提高

移动构造的本质:将参数右值的资源窃取过来,占为己有,就不用创建临时对象,开辟空间,而是直接窃取别人的资源来构造自己。

为什么可以这样呢?

右值引用可以延长右值的生命周期,使其生命周期向右值引用看齐

这样函数中的返回值本来出了函数作用域就会被销毁,回收资源,右值引用后,就延长了生命周期,不会被回收,

可以直接拿来构造新的对象,不用再创建临时对象,造成额外开销。

6.4万能引用

“万能引用”(Universal Reference)是 C++ 编程中的一个术语,主要用于描述一种能够同时绑定到左值(lvalue)和右值(rvalue)的引用类型。

万能引用通常出现在模板编程中,允许函数模板接受任意类型的参数,从而实现更灵活和通用的代码设计。

来看以下例子

// 接受左值引用
void Fun(int& x) {std::cout << "Fun(int&): "<< x << std::endl;
}// 接受右值引用
void Fun(int&& x) {std::cout << "Fun(int&&): "<< x << std::endl;
}// 万能引用的模板函数,调用相应的 Fun 函数
template<typename T>
void CallFun(T&& arg) {Fun(arg);
}

在main中进行调用模版函数

int a = 10;
const int b = 20;CallFun(a); // 传递左值,调用 Fun(int&)CallFun(30); // 传递右值,调用 Fun(int&&)

运行结果:

 

按理说,应该会调用一个 Fun(int&&) 和一个Fun(int&),但事实并不是这样

为什么?

模版的万能引用只是提供了能够同时接收左值引用和右值引用的能力

但在后续的使用中,统一当成左值来使用

进入模版函数体中,只有左值,没有右值

所以,会调用两次 Fun(int&)

我们希望事情按照我们的期望发展

在模版函数体中,右值和左值也会保持原来的属性,不会变化

这时候,就需要完美转发

6.5完美转发——forward

完美转发是 C++11 引入的一项重要特性,旨在函数模板中将参数以其原始的值类别​(左值或右值)传递给其他函数,确保在转发过程中不改变参数的性质。

基本造型:​

std::forward<T>(arg)

说明:

  • arg即为要保持原始值类比的对象

示例:

在万能转发的模版函数中,添加完美转发

template<typename T>
void CallFun(T&& arg) {Fun(std::forward<T>arg);
}

main照常

int main() 
{int a = 10;const int b = 20;CallFun(a); // 传递左值,调用 Fun(int&)CallFun(30); // 传递右值,调用 Fun(int&&)return 0;
}

 运行一下:

和我们的预期一致

右值引用和左值引用各有各的用法,并不是随意创造的,具体怎么用,需要结合实际情况进行分析选择。


结语

  综上所述,C++11引入的初始化列表、右值引用以及nullptr等特性,为C++语言的发展注入了新的活力。初始化列表通过提供统一的初始化语法,增强了代码的可读性和可维护性;右值引用凭借其独特的语义,极大地优化了对象的移动语义和资源管理效率;nullptr则为指针类型提供了一个明确而安全的表示。这些特性的引入,不仅丰富了C++语言的编程范式,更为现代软件开发中的高效性、可靠性要求提供了有力支持,推动了面向对象编程向更高层次发展。

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

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

相关文章

【C++网络编程】第5篇:UDP与广播通信

一、UDP协议核心特性 1. UDP vs TCP ​特性 ​UDP​TCP连接方式无连接面向连接&#xff08;三次握手&#xff09;可靠性不保证数据到达或顺序可靠传输&#xff08;超时重传、顺序控制&#xff09;传输效率低延迟&#xff0c;高吞吐相对较低&#xff08;因握手和确认机制&…

ffmpeg+QOpenGLWidget显示视频

​一个基于 ‌FFmpeg 4.x‌ 和 QOpenGLWidget的简单视频播放器代码示例&#xff0c;实现视频解码和渲染到 Qt 窗口的功能。 1&#xff09;ffmpeg库界面&#xff0c;视频解码支持软解和硬解方式。 硬解后&#xff0c;硬件解码完成需要将数据从GPU复制到CPU。优先采用av_hwf…

20250324-使用 `nltk` 的 `sent_tokenize`, `word_tokenize、WordNetLemmatizer` 方法时报错

解决使用 nltk 的 sent_tokenize, word_tokenize、WordNetLemmatizer 方法时报错问题 第 2 节的手动方法的法1可解决大部分问题&#xff0c;可首先尝试章节 2 的方法 1. nltk.download(‘punkt_tab’) LookupError: *******************************************************…

【VolView】纯前端实现CT三维重建-CBCT

文章目录 什么是CBCTCBCT技术路线使用第三方工具使用Python实现使用前端实现 纯前端实现方案优缺点使用VolView实现CBCT VolView的使用1.克隆代码2.配置依赖3.运行4.效果 进阶&#xff1a;VolView配合Python解决卡顿1.修改VtkThreeView.vue2.新增Custom3DView.vue3.Python生成s…

debug - 安装.msi时,为所有用户安装程序

文章目录 debug - 安装.msi时&#xff0c;为所有用户安装程序概述笔记试试在目标.msi后面直接加参数的测试 备注备注END debug - 安装.msi时&#xff0c;为所有用户安装程序 概述 为了测试&#xff0c;装了一个test.msi. 安装时&#xff0c;只有安装路径的选择&#xff0c;没…

Java Stream两种list判断字符串是否存在方案

这里写自定义目录标题 背景初始化方法一、filter过滤方法二、anyMatch匹配 背景 在项目开发中&#xff0c;经常遇到筛选list中是否包含某个子字符串&#xff0c;有多种方式&#xff0c;本篇主要介绍stream流的filter和anyMatch两种方案&#xff0c;记录下来&#xff0c;方便备…

3. 轴指令(omron 机器自动化控制器)——>MC_SetOverride

机器自动化控制器——第三章 轴指令 12 MC_SetOverride变量▶输入变量▶输出变量▶输入输出变量 功能说明▶时序图▶重启运动指令▶多重启动运动指令▶异常 MC_SetOverride 变更轴的目标速度。 指令名称FB/FUN图形表现ST表现MC_SetOverride超调值设定FBMC_SetOverride_instan…

VLAN章节学习

为什么会有vlan这个技术&#xff1f; 1.通过划分广播域来降低广播风暴导致的设备性能下降&#xff1b; 2.提高网络管理的灵活性和通过隔离网络带来的安全性&#xff1b; 3.在成本不变的情况下增加更多的功能性&#xff1b; VLAN又称虚拟局域网&#xff08;再此扩展&#xf…

FPGA时钟约束

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、Create_clock 前言 时钟周期约束&#xff0c;就是对时钟进行约束。 一、Create_clock create_clock -name <name> -period <period> -waveform …

spring-security原理与应用系列:建造者

目录 1.构建过程 AbstractSecurityBuilder AbstractConfiguredSecurityBuilder WebSecurity 2.建造者类图 SecurityBuilder ​​​​​​​AbstractSecurityBuilder ​​​​​​​AbstractConfiguredSecurityBuilder ​​​​​​​WebSecurity 3.小结 紧接上一篇文…

OpenHarmony子系统开发 - 电池管理(二)

OpenHarmony子系统开发 - 电池管理&#xff08;二&#xff09; 五、充电限流限压定制开发指导 概述 简介 OpenHarmony默认提供了充电限流限压的特性。在对终端设备进行充电时&#xff0c;由于环境影响&#xff0c;可能会导致电池温度过高&#xff0c;因此需要对充电电流或电…

xy轴不等比缩放问题——AUTOCAD c#二次开发

在 AutoCAD .net api里&#xff0c;部分实体&#xff0c;像文字、属性、插入块等&#xff0c;是不支持非等比缩放的。 如需对AutoCAD中图形进行xyz方向不等比缩放&#xff0c;则需进行额外的函数封装。 选择图元&#xff0c;指定缩放基准点&#xff0c;scaleX 0.5, scaleY …

如何在 HTML 中创建一个有序列表和无序列表,它们的语义有何不同?

大白话如何在 HTML 中创建一个有序列表和无序列表&#xff0c;它们的语义有何不同&#xff1f; 1. HTML 中有序列表和无序列表的基本概念 在 HTML 里&#xff0c;列表是一种用来组织信息的方式。有序列表就是带有编号的列表&#xff0c;它可以让内容按照一定的顺序呈现&#…

Postman最新详细安装及使用教程【附安装包】

一、Postman介绍 ‌Postman是一个功能强大的API测试工具&#xff0c;主要用于模拟和测试各种HTTP请求&#xff0c;支持GET、POST、PUT、DELETE等多种请求方法。‌通过Postman&#xff0c;用户可以发送请求并查看返回的响应&#xff0c;检查响应的内容和状态&#xff0c;从而验…

整合vue+Element UI 开发管理系统

1、 安装 Node.js 和 npm 确保安装了 Node.js 和 npm。可以通过 Node.js 官网 下载。 2、 创建 Vue 项目 安装cli npm install -g vue/cli 使用 Vue CLI 创建一个新的 Vue 项目。 vue create admin-system cd admin-system npm run serve 出现这个页面表示vue创建成功 安…

3. 轴指令(omron 机器自动化控制器)——>MC_Stop

机器自动化控制器——第三章 轴指令 9 MC_Stop变量▶输入变量▶输出变量▶输入输出变量 功能说明▶指令详情▶时序图▶重启运动指令▶多重启动运动指令▶异常 MC_Stop 使轴减速停止。 指令名称FB/FUN图形表现ST表现MC_Stop强制停止FBMC_Stop_instance (Axis :《参数》 ,Execu…

C#中修饰符——abstract、virtual

一、多态简介 在面向对象编程的过程中&#xff0c;多态体现出来的是【一个接口&#xff0c;多个功能】&#xff1b;多态性体现在2个方面&#xff1a; 1、程序运行时&#xff0c;在方法参数、集合或数组等位置&#xff0c;派生类对象可以作为基类的对象处理&#xff1b;这样该对…

Spring Boot + Spring Integration整合MQTT打造双向通信客户端

1. 概述 本文分两个章节讲解MQTT相关的知识&#xff0c;第一部份主要讲解MQTT的原理和相关配置&#xff0c;第二个章节主要讲和Spring boot的integration相结合代码的具体实现&#xff0c;如果想快速实现功能&#xff0c;可直接跳过第一章节查看第二章讲。 1.1 MQTT搭建 为了…

2025前端面试题记录

vue项目目录的执行顺序是怎么样的&#xff1f; 1、package.json   在执行npm run dev时&#xff0c;会在当前目录寻找package.json文件&#xff0c;此文件包含了项目的名称版本、项目依赖等相关信息。 2、webpack.config.js(会被vue-cli脚手架隐藏) 3、vue.config.js   对…

专题|Python贝叶斯网络BN动态推理因果建模:MLE/Bayes、有向无环图DAG可视化分析呼吸疾病、汽车效能数据2实例合集

原文链接&#xff1a;https://tecdat.cn/?p41199 作为数据科学家&#xff0c;我们始终在探索能够有效处理复杂系统不确定性的建模工具。本专题合集系统性地解构了贝叶斯网络&#xff08;BN&#xff09;这一概率图模型在当代数据分析中的创新应用&#xff0c;通过开源工具bnlea…