欢迎回到 C++ - 现代 C++(心得-壹)

原文链接欢迎回到 C++ - 现代 C++ | Microsoft Learn

这里先是讲了现代c++的优势,其相对于其他编程语言有快速、高效。 相对于其他语言,该语言更加灵活,跨平台(硬件平台)性也很强,可以直接访问硬件,虽然现在编程千千万但是访问硬件的语言这点可以干掉几乎90%的编程语言,其应用广泛。但是现在很多硬件的编程还是使用c语言,最近也有慢慢被c++替代的趋势。现代 C++ 代码更加简单、安全、美观,而且速度仍像以往一样快速。

接下来从几个方面来大体概括了一下现代C++的优势。

资源和智能指针

原始的c语言容易出现的内存泄露问题这里可以通过RAII(Resource Acquisition Is Initialization)的原则进行规避,这个规则要求资源(堆内存、文件句柄、套接字等)应由对象“拥有”。 该对象在其构造函数中创建或接收新分配的资源,并在其析构函数中将此资源删除。 RAII 原则可确保当所属对象超出范围时,所有资源都能正确返回到操作系统。

为了让我们更方便的遵循这个原则编程,c++标准库提供了三种智能指针类型:std::unique_ptr、std::shared_ptr 和 std::weak_ptr。

智能指针可以自己管理对象的资源,当对象被释放的时候对应的资源也会被释放,这些智能指针都是通过模板<Template>来实现的。我们只需要把我们需要的对象通过std::unique_ptr<int[]> data;

unique_ptr来指向对象,实例化的时候通过make_unique来实现,data = std::make_unique<int[]>(size)

这样实例化的对象我们就直接遵循了RAII原则。对象的管理交给智能指针,这个只能指针也是一个模板类,其内部的实现就是管理对象的生存周期以及资管的管理。比如unique_ptr 存储指向拥有的对象或数组的指针。 此对象/数组仅由 unique_ptr 拥有。 unique_ptr 被销毁后,此对象/数组也将被销毁。shared_ptr 类描述使用引用计数来管理资源的对象。 shared_ptr 对象有效保留一个指向其拥有的资源的指针或保留一个 null 指针。 资源可由多个 shared_ptr 对象拥有;当拥有特定资源的最后一个 shared_ptr 对象被销毁后,资源将释放。

std::string 和 std::string_view

这两个类为了消除字符串编程的过程中遇到的一些问题,在编程的过程中难免会引用字符串。

C语言中对于字符串的使用容易出现bug,尤其各种字符格式转换的过程,c++直接实现了自己的库

 std::string 和 std::wstring,几乎可以消除与 C 样式字符串关联的所有错误。并且同时提供搜索、追加和在前面追加等操作。在 C++17 中,可以使用 std::string_view,以便提高性能。

这里可以理解到c++通过自己实现的标准库,帮我们造了一个轮子。c++把之前c语言编程中遇到的一些问题做成了标准库,避免那些问题的实现,我们通过新类直接引用即可。

std::vector 和其他标准库容器

从里面来看这是一个向量,向量在编程中也属于一种容器,其他还有map等,用来管理我们的一些数据类型,比如字符串或者整形浮点型等。容器就是装东西的,在编程语言中是用来装数据的,不同的数据类型都可以装到容器中,包括自己定义的类,我们自己定义的类也可以理解为一种数据类型,在程序的世界中一起资源皆是数据类型,都是数字最终都对应010101,针对这些容器c++都实现了自己的标准库,java等其他语言也对这些容器做了标准库,这些库在使用的过程中很多优势,尤其是其丰富的功能以及久经考验的算法。比如查找排序等,避免自己再次造轮子,除非你的算法由于当前的api,如果那样的话c++肯定会收录你的。

标准库算法

这里讲到了C++里面的一些标准库算法,包含我们常见的如搜索、排序、筛选和随机化等,这些分类在不断增长。 数学库的内容很广泛。 在 C++17 及更高版本中,提供了许多算法的并行版本。

以下是一些重要示例:

  • for_each,默认遍历算法(以及基于范围的 for 循环)。

  • transform,用于对容器元素进行非就地修改

  • find_if,默认搜索算法。

  • sortlower_bound 和其他默认的排序和搜索算法。

auto comp = [](const widget& w1, const widget& w2)
     { return w1.weight() < w2.weight(); }

sort( v.begin(), v.end(), comp );

auto i = lower_bound( v.begin(), v.end(), widget{0}, comp );

这个代码段里面用到了lambda表达式,一个简单的引用示例。

用 auto 替代显式类型名称

auto是一个非常智能的类型指定关键字,它可以自己推导出数据类型,避免我们定义的时候出现错误。可以代指任意类型,现在很多语言在定义的数据的时候都支持了任意类型,比如kotlin中使用var代指定义数据类型,不用指定具体的类型,可以在运行的时候进行决定。python直接连var这种指定都省略了。

基于范围的 for 循环

在java早就使用了这种编程方式,很多现代语言也采用了这种方式,传统的方式写起来真的很麻烦,限制很大如下:

std::vector<int> v {1,2,3};

// C-style

for(int i = 0; i < v.size(); ++i)

{

        std::cout << v[i];

}

但是现代语言的写法直接如下:

// Modern C++:

for(auto& num : v)

{

std::cout << num;

}

直接给出需要遍历的对象,甚至类型都不必指定直接auto,然后我们可以轻易遍历引用其中的数据,省去很多无用的代码。

用 constexpr 表达式替代宏

constexpr也是现代c++的产物,原始定义编译时的常量采用#define宏定义的方式,但是这种方式容易出错而且无法调试,所以出现了constexpr,在预编译的时候就进行处理。

 在现代 C++ 中,应优先使用 constexpr 变量定义编译时常量

其平替效果如下:

#define SIZE 10 // C-style
constexpr int size = 10; // modern C++

与 const 一样,它可以应用于变量:如果任何代码试图 modify(修改)该值,将引发编译器错误。 与 const 不同,constexpr 也可以应用于函数和类 constructor(构造函数)。 constexpr 指示值或返回值是 constant(常数),如果可能,将在编译时进行计算。

统一初始化

现代C++支持任意类型的括号初始化,当我们需要初始化数组矢量等容器时其优势明显,编译器可以自己推断每个元素的类型,比如下面的示例:

#include <vector>

struct S
{
    std::string name;
    float num;
    S(std::string s, float f) : name(s), num(f) {}
};

int main()
{
    // C-style initialization
    std::vector<S> v;
    S s1("Norah", 2.7);
    S s2("Frank", 3.5);
    S s3("Jeri", 85.9);

    v.push_back(s1);
    v.push_back(s2);
    v.push_back(s3);

    // Modern C++:
    std::vector<S> v2 {s1, s2, s3};

    // or...
    std::vector<S> v3{ {"Norah", 2.7}, {"Frank", 3.5}, {"Jeri", 85.9} };

}

这个示例中,我们的类(C++中结构体和类class等效)S有一个自己的构造,

在v3实例中我们的vector通过<>指定了S类型,所以编译器可以自己推导类型实例,所以我们可以根据S的构造运用{}直接传参构成实例,这时候编译器自己帮我们推导出S类型的实例push到vector实例v3中。省去了v2的meige

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

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

相关文章

第三方UI组件库的样式修改

一、场景&#xff1a; 一般来说&#xff0c;我们在使用第三方UI组件库&#xff08;如&#xff1a;vant&#xff0c;element-plus等&#xff09;时&#xff0c;UI组件库自带的样式不能满足用户的个性化需求时&#xff0c;就需要我们开发人员自己动手对组件库的局部样式进行修改。…

Robot Grasp[Code with paper]

题目/摘要重点 Deep Object Pose Estimation for Semantic Robotic Grasping of Household Objects 使用合成数据为机器人训练深度神经网络 操纵有望获得几乎无限数量的预标记 训练数据。合成数据一直在弥合所谓的现实差距&#xff0c;因此 在合成数据上训练的网络在暴露于现…

PoE技术详解

标准的五类网线有四对双绞线&#xff0c;IEEE 802.3af和IEEE 802.3at允许两种用法&#xff1a;通过空闲线对供电或者数据线对供电。IEEE 802.3bt允许通过空闲线对供电、通过数据线对供电或者空闲线对和数据线对一起供电&#xff0c;如图16.1所示。 图 16.1 PoE供电线对 当在一…

考研英语语法(三十九)

平行结构-分类 名词&#xff08;词组&#xff09;的平行并列 The English,the Germans,the Dutch and the French were investing in Britains former colony The English ,the Germans ,the Dutch and the French The networked com…

整数的立方和

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

入门指南:使用Element UI构建漂亮的Vue.js应用

文章目录 &#x1f342;引言&#x1f342;安装并引入Element UI&#x1f342;使用Element UI组件&#x1f342;更多常用组件&#x1f341;Button 按钮&#x1f341;Input 输入框&#x1f341;Radio 单选框&#x1f341;Checkbox 多选框&#x1f341;Select 选择器&#x1f341;…

用取样思想一探AIX上进程性能瓶颈

本篇文章也是我在解决客户问题时的一些思路&#xff0c;希望对读者有用。 本文与GDB也与DBX&#xff08;AIX上的调试工具&#xff09;无关&#xff0c;只是用到了前文《GDB技巧》中的思想&#xff1a;取样思想 客户问题&#xff1a; 原始问题是磁盘被占满了&#xff0c;通过…

C++ 系列 第四篇 C++ 数据类型上篇—基本类型

系列文章 C 系列 前篇 为什么学习C 及学习计划-CSDN博客 C 系列 第一篇 开发环境搭建&#xff08;WSL 方向&#xff09;-CSDN博客 C 系列 第二篇 你真的了解C吗&#xff1f;本篇带你走进C的世界-CSDN博客 C 系列 第三篇 C程序的基本结构-CSDN博客 前言 面向对象编程(OOP)的…

Star 10.4k!推荐一款国产跨平台、轻量级的文本编辑器,内置代码对比功能

notepad 相信大家从学习这一行就开始用了&#xff0c;它是开发者/互联网行业的上班族使用率最高的一款轻量级文本编辑器。但是它只能在Windows上进行使用&#xff0c;而且正常来说是收费的&#xff08;虽然用的是pj的&#xff09;。 对于想在MacOS、Linux上想使用&#xff0c;…

不瞒各位,不安装软件也能操作Xmind文档

大家好&#xff0c;我是小悟 作为搞技术的一个人群&#xff0c;时不时就要接收产品经理发过来的思维脑图&#xff0c;而此类文档往往是以Xmind编写的&#xff0c;如果你的电脑里面没有安装Xmind的话&#xff0c;不好意思&#xff0c;是打不开这类后缀结尾的文档。 打不开的话…

TensorRT-LLM保姆级教程(二)-离线环境搭建、模型量化及推理

随着大模型的爆火&#xff0c;投入到生产环境的模型参数量规模也变得越来越大&#xff08;从数十亿参数到千亿参数规模&#xff09;&#xff0c;从而导致大模型的推理成本急剧增加。因此&#xff0c;市面上也出现了很多的推理框架&#xff0c;用于降低模型推理延迟以及提升模型…

即兴语录-即兴小索奇语录

如果你想要实现自己的梦想&#xff0c;就不能害怕失败。因为失败是成功的垫脚石。 谁说失败了就一定是坏事&#xff1f;其实每一次失败都是一次成功的垫脚石。只有经历过失败的人&#xff0c;才能更好地理解成功的滋味。

处理器中的TrustZone之安全状态

在这个主题中&#xff0c;我们将讨论处理器内对TrustZone的支持。其他部分则涵盖了在内存系统中的支持&#xff0c;以及建立在处理器和内存系统支持基础上的软件情况。 3.1 安全状态 在Arm架构中&#xff0c;有两个安全状态&#xff1a;安全状态和非安全状态。这些安全状态映射…

改善你的登录页:登录设计的极致指南!

登录页面相当于产品的立面。无论是网站还是APP&#xff0c;用户打开后&#xff0c;首先映入眼帘的就是登录页面&#xff0c;用户在这里进行下一步的操作。如果登录页面的UI设计错误&#xff0c;界面视觉混乱&#xff0c;往往会在用户详细了解产品之前关闭并离开。希望大家通过这…

【qml入门系列教程】:qml QtObject用法介绍

作者:令狐掌门 技术交流QQ群:675120140 博客地址:https://mingshiqiang.blog.csdn.net/ 文章目录 QtObject 是 Qt/QML 中的一个基础类型,通常用作创建一个没有 UI 的(不渲染任何东西的)纯逻辑对象。可以使用它来组织代码、存储状态或者作为属性和方法的容器。 以下是如何…

dp-拦截导弹2

所有代码均来自于acwing中的算法基础课和算法提高课 Description 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c; 但是以后每一发炮弹都不能高于前一发的高度。…

Python神器:快速删除文本文件中指定行的方法

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 1. 简介 文件操作是编程中的重要方面。Python作为强大的编程语言&#xff0c;提供了处理文件的能力。删除特定行是文件处理中常见的需求。 2. 打开文件和读取内容 当打开文件并读取其内容时&#xff0c;open(…

Windows下打包C++程序无法执行:无法定位程序输入点于动态链接库

1、问题描述 环境&#xff1a;CLionCMakeMinGW64遇到问题&#xff1a;打包的exe无法运行&#xff0c;提示无法定位程序输入点于动态链接库。 2、解决思路 ​ 通过注释头文件的方式&#xff0c;初步定位问题是因为使用了#include <thread> 多线程库引起的。而且exe文件…

机器人学英语

我的prompt i want to you act as an english language teacher/asistant to help me study english, you could teach me in such a way: you ask me questions and i answer them, and you help me correct the grammer or word mistakes in my expression and polish my par…

Kubeadm构建K8S集群指南:从环境准备到Dashboard部署的详细步骤与常见问题解决方案

文章目录 一、环境准备1、准备1主2从2、设置主机名与时区3、添加hosts网络主机配置4、关闭防火墙5、验证是否配置正确 二、安装Kubeadm1、在每个Centos上安装Docker2、确保从cgroups均在同一个从groupfs3、安装kubeadm集群部署工具4、关闭交换区5、配置网桥6、通过镜像安装k8s7…