C++学习记录:

news2025/4/19 5:58:32

        今天我们来学习一门新的语言,也是C语言最著名的一个分支语言:C++。

           在C++的学习中,我们主要学习的三大组成部分:语法、STL、数据结构。

        C++的介绍

        C++的历史可追溯至1979年,当时贝尔实验室的本贾尼·斯特劳斯特卢普博士在面对复杂软件开发任务、尤其是模拟和操作系统开发工作的时候发现了现有语言(如C语言)在表达能力、维护能力、拓展能力的不足。1983年本佳尼博士基于C语言添加了面向对象的编程的特性,也就是C++的雏形。

        C++的标准化工程从1989年开始,并成立了ANSI和ISO国际标准化组织的联合标准化委员会。1994年该委员会第一次提出C++的标准化草案。1997年联合标准委员会通过了该标准的最终草案,1998年C++的ANSI\ISO标准正式投入使用。

以下是C++不同版本

年份标准名称核心特性影响与意义
1985C++ 1.0类、继承、虚函数、运算符重载奠定C++面向对象基础,首个商业编译器发布
1989C++ 2.0多重继承、抽象类、静态成员函数扩展面向对象能力
1998C++98 (ISO/IEC 14882:1998)STL标准模板库、异常处理、RTTI、命名空间首个国际标准,成为工业级语言标杆
2003C++03 (ISO/IEC 14882:2003)修复C++98缺陷、值初始化语法改进过渡性修订版本,未引入重大特性
2011C++11 (ISO/IEC 14882:2011)auto、移动语义、Lambda、智能指针、constexpr、并发库现代C++革命性起点,大幅提升开发效率与安全性
2014C++14 (ISO/IEC 14882:2014)泛型Lambda、二进制字面量、constexpr函数增强对C++11的完善补充
2017C++17 (ISO/IEC 14882:2017)结构化绑定、std::filesystemif constexprstd::optional简化代码编写,强化编译期计算
2020C++20 (ISO/IEC 14882:2020)概念(Concepts)、协程(Coroutines)、模块(Modules)、范围库(Ranges)重大范式革新,提升泛型编程能力与工程化水平
2023C++23 (ISO/IEC 14882:2023*)标准库模块化、多维数组(mdspan)、格式化库(std::format)、网络库原型进一步优化工程实践,增强数学计算与I/O能力(*预计2023年底发布)

       编译器

        但是标准委员会只管理C++的特性,其实现依然要依赖编译器的实施,常用的编译器有三个:VS系列(微软开发)、g++(Linux系统上运行)、clang++(应用较少)。

        C++的参考文档

        https://legacy.cplusplus.com/reference/

        (非官方文档,标准也只到C++11,但是方便阅读)

        https://zh.cppreference.com/w/cpp

        https://en.cppreference.com/w/

        (官方文档,内容更新至最新版本,支持中英双语查看,但是不方便阅读查看。)

        C++的重要性

        TIOBE 编程社区指数是一个衡量编程语言受欢迎程度的指标,评判的依据来自世界范围内的工程师、课程、供应商及搜索引擎。以下是截止2025年4月编程语言排行榜

        

        python因为近来AI的高速发展而位列第一且上升速度较快。但是由以上图可以发现,C\C++仍然占大部分。尽管相较于JAVA,C++的生态环境开发比较慢(JAVA的网络库约半年更新一次)。

C++在工作领域的应用

        C++的应用领域主要在服务器端、游戏(引擎)、机器学习引擎、音视频处理、嵌入式软件、电信设备、金融应用、操作系统、编译器、基础架构、基础工具、硬件交互等很多方面。

1.大型软件开发:如编译器、数据库、操作系统、浏览器等等

2.音视频处理:主要技术栈就是C++

3. PC客户端开发:一般是Windows啊桌面软件。技术栈一般要学习C++和QT(QT是一种跨平台的C++图形界面程序)

4.服务端开发:高性能服务地区

5.嵌入式开发:

6.游戏引擎开发:

7.机器学习引擎开发:底层算法是C++,上层用python封装

8.测试开发:

C++学习书籍推荐

《C++primer》:主要讲解语法,很经典的语法书记。比较晦涩难懂。在拥有一定基础后可以当作语法字典。

《STL源码剖析》:从底层实现的角度深度结合STL,深度剖析STL源码的实现。建议有一定基础后学习观看。

《Effective C++》:关于这本书有一句评价:将程序员分为看过这本书的和没看过这本书的。这本书主要讲解了55个如何正确高效地使用C++的条款。建议有一定基础后或者在工作一两年后看。

请认准以下三本书的封面:

C++学习

首先我们来看一段标准的C++语法写的hello world:

C语言其实一定程度上也可以兼容(但是慎用!!!)  

        那为什么C++是这么个写法呢?接下来我们就来解析一下:

        命名空间

        相较于C++,C语言有命名冲突的问题。我们来上一段代码演示一下:

        

再上图代码中,打印出来的rand的值就是我们定义的10.

但是当我们将头文件<stdlib.h>包含在内的时候,就会发生如下报错:

namespace的定义

        1.定义命名空间,需要namespace关键字,后面跟变量的名字,接着一对{}即可,{}中为命名空间的成员。命名空间可以定义变量、类型、函数等。

        2.namespace 本质上是定义一个域,这个域跟全局域各自独立,不同的域定义同名变量。所以一下代码的rand不再冲突了

        3.C++中域有函数定义域、全局域、命名空间域、类域(定义域和全局域影响生命周期,命名空间域和类域不会 );域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义),所以有了域隔离,名字冲突就解决了。局部域与全局域除了影响编译查找逻辑,还会影响变量的生命周期。命名空间和域类不影响变量生命周期

4.namespace只能定义在全局(当然也可以嵌套定义)

5.项目工程中多文件定义的同名namespace会认为是同一个namespace,不会冲突。

6.C++的标准库都放在一个叫std的(standard)的命名空间中。

命名空间的使用

        编译器查找一个变量的声明/定义时,默认只会在全局或者局部找,不会到命名空间去查找。所以我们要使用命名空间中的函数和变量,需要以下三种方式:

1.指定命名空间去访问(项目中推荐这种用法)

2.using将命名空间中的成员展开,项目中经常访问的不存在冲突的成员推荐用这种方式

3.展开命名空间中全部成员(项目中不推荐,因为风险很大,平时小练习为了方便可以用)

如图,以下两种方式等效。

第一种是指定命名方式访问。

,第二种方式就是展开命名空间。

接下来回归最开始的hello world程序

        

如果我们将展开命名空间std的代码注释掉,就会发生如下情况

        

在这种情况下如果我们想要打印,可以这样

如果多次应用cout变量,可以这样

C++的输入输出

1.<iostream>是Input Output Stream的缩写,是标准的输入输出流库,定义了输入输出的对象。

2.std::cin是istream类的对象,主要面对窄字符的标准输入流。

3.std::cout是ostream类的对象,主要面对窄字符的标准输出流。

4.std::endl是操作符,底层实现的一个函数,流插入输出时,相当于插入一个换行字符加刷新缓冲区。

5.<<是流插入运算符,>>是流提取运算符(C语言还用它来作为左移右移运算符)

6.使用C++的输入输出更加方便,不需要像printf函数和scanf函数,需要手动指定格式,C++的输入输出可以自动识别变量类型(本质是通过函数重载实现),最重要的是C++的流能更好的支持自定义类型的对象的输入输出。

例如:针对C++中的”类“类型, printf函数作为原生函数,没有对应的格式去打印它,但是C++可以。cin和cout的优势是可以输入输出任意类型。本质是为了支持任意类型输入输出。

7.IO类型涉及类和对象,运算符重载、继承等多方面面对对象的知识,后续学习可以认识。

8.cout/cin/endl都是属于C++标准库,C++标准库放在一个叫std(standard)的命名空间中,所以要通过命名空间的使用方式去使用它们

9.在vs中,我们只要包含了<iostream>头文件即使不包含<stdio.h>也可以使用printf函数和scanf函数,但是注意这种写法在其他编辑器上可能报错。

        缺省参数

        1.缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。(有些地方把缺省参数也叫默认参数)
        2.全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,,不能间隔跳跃给缺省值。
        3.带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参。
        4.函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声照给缺省值

具体如下图所示

但是缺省参数不可以这样传参

同理也不可以只传递第三个参数不传递第一个和第二个。

今天的C++学习就到这里,感谢各位读者大大的观看,求一个赞,谢谢

        

        

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

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

相关文章

等离子体浸没离子注入(PIII)

一、PIII 是什么&#xff1f;基本原理和工艺 想象一下&#xff0c;你有一块金属或者硅片&#xff08;就是做芯片的那种材料&#xff09;&#xff0c;你想给它的表面“升级”&#xff0c;让它变得更硬、更耐磨&#xff0c;或者有其他特殊功能。怎么做呢&#xff1f;PIII 就像是用…

idea中提高编译速度研究

探索过程&#xff1a; 有三种情况&#xff1a; 第一种&#xff1a; idea中用eclipse编译器编译springboot项目&#xff0c;然后debug启动Application报错找不到类。 有待继续研究。 第二种&#xff1a; idea中用javac编译器编译springboot项目&#xff0c;重新构建用时&a…

静态链接part2

编译 语义分析 由语义分析器完成&#xff0c;这个步骤只是完成了对表达式的语法层面的分析&#xff0c;它并不了解这个语句是否真的有意义&#xff08;例如在C语言中两个指针做乘法运算&#xff0c;这个语句在语法上是合法的&#xff0c;但是没有什么意义&#xff1b;还有同样…

Vue3+Vite+TypeScript+Element Plus开发-17.Tags-组件构建

系列文档目录 Vue3ViteTypeScript安装 Element Plus安装与配置 主页设计与router配置 静态菜单设计 Pinia引入 Header响应式菜单缩展 Mockjs引用与Axios封装 登录设计 登录成功跳转主页 多用户动态加载菜单 Pinia持久化 动态路由 -动态增加路由 动态路由-动态删除…

3D语义地图中的全局路径规划!iPPD:基于3D语义地图的指令引导路径规划视觉语言导航

作者&#xff1a; Zehao Wang, Mingxiao Li, Minye Wu, Marie-Francine Moens, Tinne Tuytelaars 单位&#xff1a;鲁汶大学电气工程系&#xff0c;鲁汶大学计算机科学系 论文标题&#xff1a; Instruction-guided path planning with 3D semantic maps for vision-language …

ShellScript脚本编程

语法基础 脚本结构 我们先从这个小demo程序来窥探一下我们shell脚本的程序结构 #!/bin/bash# 注释信息echo_str"hello world"test(){echo $echo_str }test echo_str 首先我们可以通过文本编辑器(在这里我们使用linux自带文本编辑神器vim)&#xff0c;新建一个文件…

【HarmonyOS 5】敏感信息本地存储详解

【HarmonyOS 5】敏感信息本地存储详解 前言 鸿蒙其实自身已经通过多层次的安全机制&#xff0c;确保用户敏感信息本地存储安全。不过再此基础上&#xff0c;用户敏感信息一般三方应用还需要再进行加密存储。 本文章会从鸿蒙自身的安全机制进行展开&#xff0c;最后再说明本地…

探索鸿蒙沉浸式:打造无界交互体验

一、鸿蒙沉浸式简介 在鸿蒙系统中&#xff0c;沉浸式是一种极具特色的设计理念&#xff0c;它致力于让用户在使用应用时能够全身心投入到内容本身&#xff0c;而尽可能减少被系统界面元素的干扰。通常来说&#xff0c;就是将应用的内容区巧妙地延伸到状态栏和导航栏所在的界面…

网站301搬家后谷歌一直不收录新页面怎么办?

当网站因更换域名或架构调整启用301重定向后&#xff0c;许多站长发现谷歌迟迟不收录新页面&#xff0c;甚至流量大幅下滑。 例如&#xff0c;301跳转设置错误可能导致权重传递失效&#xff0c;而新站内容与原站高度重复则可能被谷歌判定为“低价值页面”。 即使技术层面无误&a…

在Mac上离线安装k3s

目录 首先是安装multipass。 1. 系统要求 2. 环境准备 本来想照着网上文档学习安装一下k3s&#xff0c;没想到在docker被封了之后&#xff0c;现在想通过命令行去下载github的资源也不行了&#xff08;如果有网友看到这个文档、并且知道问题原因的&#xff0c;请留言告知&am…

2025低代码平台选型策略:ROI导向下的功能与成本权衡

在当今快速变化的商业环境中&#xff0c;企业面临着前所未有的挑战与机遇。数字化转型已成为企业提升竞争力的关键&#xff0c;而软件开发的高成本和长周期无疑是实现这一转型的绊脚石。 低代码平台的兴起&#xff0c;为企业提供了一种高效、灵活的解决方案&#xff0c;使得非…

Redis的IO多路复用

1 传统的socket编码模型 传统 Socket 模型通常采用 多线程/多进程 或 阻塞 I/O 的方式处理网络请求。以下是典型实现步骤&#xff1a; 创建套接字&#xff08;Socket&#xff09; 步骤&#xff1a;调用 socket() 创建一个 TCP/UDP 套接字。通常把这个套接字称为【主动套接字】…

基于YOLOv9的课堂行为检测系统

基于YOLOv9的课堂行为检测系统 项目概述 本项目是一个基于YOLOv9深度学习模型的课堂行为检测系统&#xff0c;旨在通过计算机视觉技术自动识别和监测课堂中学生的各种行为状态&#xff0c;帮助教师更好地了解课堂教学效果。 项目结构 课堂行为检测/ ├── data/ │ ├──…

端、管、云一体化原生安全架构 告别外挂式防护!

面对数字化转型浪潮&#xff0c;企业网络安全风险日益凸显。数据泄露、黑客勒索等事件频发&#xff0c;合规要求加速推进。尽管企业纷纷部署了防病毒、身份认证、文件加密、入侵防护、流量监控等多种安全系统&#xff0c;但分散且孤立的架构非但没有有效抵御风险&#xff0c;反…

BI面向模型开发和面向报表开发,有什么区别?

在数字化时代&#xff0c;商业智能&#xff08;BI&#xff09;已成为企业决策不可或缺的工具。BI项目实施时&#xff0c;通常有两种开发模式&#xff1a;面向模型开发和面向报表开发。虽然两者都旨在通过数据驱动决策&#xff0c;但在开发逻辑、目标价值和技术路径上存在显著差…

进程控制(上)【Linux操作系统】

进程控制 写时拷贝 本质是一种减少深拷贝的方法 Linux中有很多拷贝的场景都用得上写时拷贝&#xff0c;下面以创建子进程时的写时拷贝为例&#xff1a; 子进程被创建的时候&#xff1a; 会继承父进程的mm_struct和页表 所以子进程刚刚继承时&#xff0c;父子进程的代码和数据…

5G网络下客户端数据业务掉线频繁

上层应用的日志和界面在待机状态下&#xff08;即没有做通话等业务操作&#xff09;&#xff0c;会频繁提示“离线”。 主要先看有没有丢网&#xff0c;UL BLER有没有问题。确认没有问题。看到业务信道释放后也可以成功重新建链。所以以为这个只是终端业务进入dormant态的提示…

【Docker项目实战】使用Docker部署Gitblit服务器

【Docker项目实战】使用Docker部署Gitblit服务器 一、Gitblit介绍1.1 Gitblit 介绍1.2 主要特点 二、本次实践规划2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Gitblit镜像五、部署Gitbli…

Vitis: 使用自定义IP时 Makefile错误 导致编译报错

参考文章: 【小梅哥FPGA】 Vitis开发中自定义IP的Makefile路径问题解决方案 Vitis IDE自定义IP Makefile错误&#xff08;arm-xilinx-eabi-gcc.exe: error: *.c: Invalid argument&#xff09;解决方法 Vitis 使用自定义IP时: Makefile 文件里的语句是需要修改的&#xff0c;…

helm的go模板语法学习

1、helm chart 1.0、什么是helm&#xff1f; 介绍&#xff1a;就是个包管理器。理解为java的maven、linux的yum就好。 安装方法也可参见官网&#xff1a; https://helm.sh/docs/intro/install 通过前面的演示我们知道&#xff0c;有了helm之后应用的安装、升级、查看、停止都…