【C++】入门基础【上】

目录

  • 一、C++的发展历史
  • 二、C++学习书籍推荐
  • 三、C++的第一个程序
    • 1、命名空间`namespace`
    • 2、命名空间的使用
    • 3、头文件`<iostream>`是干什么的?

个人主页<—请点击
C++专栏<—请点击
在这里插入图片描述

一、C++的发展历史

C++的起源可以追溯到1979年,当时Bjarne Stroustrup(本贾尼·斯特劳斯特卢普)在贝尔实验室从事计算机科学和软件工程的研究工作。面对项目中复杂的软件开发任务,特别是模拟和操作系统的开发工作,他感受到了现有语言(如C语言)在表达能力、可维护性和可扩展性方面的不足。
1983年,Bjarne Stroustrup在C语言的基础上添加了面向对象编程的特性,设计出了C++语言的雏形,此时的C++已经有了类、封装、继承等核心概念,为后来的面向对象编程奠定了基础。这⼀年该语言被正式命名为C++。在随后的几年中,C++在学术界和工业界的应用逐渐增多。⼀些大学和研究所开始将C++作为教学和研究的首选语言,而⼀些公司也开始在产品开发中尝试使用C++。这⼀时期,C++的标准库和模板等特性也得到了进⼀步的完善和发展。
C++的标准化工作于1989年开始,并成立了⼀个ANSIISOInternational Standards Organization)国际标准化组织的联合标准化委员会。1994年标准化委员会提出了第一个标准化草案。在该草案中,委员会在保持斯特劳斯特卢普最初定义的所有特征的同时,还增加了部分新特征。
在完成C++标准化的第⼀个草案后不久,STLStandard Template Library)是惠普实验室开发的⼀系列软件的统称。它是由Alexander StepanovMeng LeeDavid R Musser在惠普实验室工作时所开发出来的。在通过了标准化第⼀个草案之后,联合标准化委员会投票并通过了将STL包含C++标准中的提议。STLC++的扩展超出C++的最初定义范围。虽然在标准中增加STL是个很重要的决定,但也因此延缓了C++标准化的进程。
1997年11月14日,联合标准化委员会通过了该标准的最终草案。1998年,C++ANSI/IS0标准被投入使用。

Bjarne Stroustrup:

Bjarne Stroustrup
在这里插入图片描述
上面这副图片是C++的版本更新情况,字体越大代表更新的力度越大,目前C++26预计在2026年公布。

二、C++学习书籍推荐

在这里插入图片描述

  • C++ Primer:主要讲解语法,经典的语法书籍,前后中期都可以看。
  • STL源码剖析:主要从底层实现的角度结合STL源码,庖丁解牛式剖析STL的实现,是侯捷老师的经典之作。
  • Effctive C++:本书也是侯捷老师翻译的,本书有⼀句评价:把C++程序员分为看过此书的和没看过此书的。

三、C++的第一个程序

在学习C语言的时候我们打印的第一个程序就是hello world!,所以我们C++的第一个程序也从它开始,C++兼容C语言绝大多数的语法,所以C语言实现的hello world!依旧可以运行,这里我们就不用C语言实现了,我们来看看C++怎么写,C++中需要把定义文件
代码后缀改为.cpp

C++:

#include <iostream>
using namespace std;int main()
{cout << "hello world!" << endl;return 0;
}

这就是C++版本的hello world!了。

运行结果:
在这里插入图片描述
刚从C语言接触到C++,这里的大部分东西,我们都看不懂,没有关系,接下来我会一一讲解。

1、命名空间namespace

C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的

C语言中的命名冲突:
我们知道在C语言中qsort是函数,假设我将它定义成int类型的全局变量,然后我不包含头文件<stdlib.h>,我们执行下面的代码:

#include <stdio.h>int qsort = 10;int main()
{printf("%d", qsort);return 0;
}

执行结果
在这里插入图片描述
之后我再加上头文件<stdlib.h>执行结果
在这里插入图片描述
程序就会出现这样的报错,因为函数在全局变量中发现了两个这样的变量名称,这就导致了命名冲突问题,而我们今天要讲的命名空间就是专门解决这个问题的。

注:只有将qsort定义成全局变量时,才会出现这样的错误,因为当它为局部变量时,打印的时候,程序会首先在局部域寻找变量,当它在局部域中找到后,就不会前往全局域寻找,就不会引发命名冲突了。

命名空间解决该问题的思路呢也很简单,举个生活中常见的例子,假设你家的大黄和邻居家的大黄一摸一样,而且都叫大黄,总是分不清谁是谁,解决这个问题只需要在狗的身上做个标记,比如让它戴个牌子就可以分清楚了,命名空间解决命名冲突的问题和这个类似,就是定义一个空间然后把冲突的变量,放进这个空间就可以了。

#include <stdio.h>
#include <stdlib.h>namespace qs
{int qsort = 10;
}int main()
{printf("%d",qs::qsort);return 0;
}

测试结果:
在这里插入图片描述
这里由于我们定义了一个命名空间,而访问这个空间需要一些小的操作,即用命名空间::成员名的方式访问指定命名空间中的成员。::是作用域解析运算符。

::变量名这样使用时表示全局作用域,即可以访问全局变量
在这里插入图片描述
如上图,当我放开时,它就会访问全局变量中的qsort函数。

注意:

  • 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型
  • namespace本质是定义出⼀个这个域跟全局域各自独立,不同的域可以定义同名变量,所以qsort不再冲突了
  • namespace只能定义在全局,当然它还可以嵌套定义
  • 项目工程中多文件中定义的同名namespace会认为是⼀个namespace不会冲突
  • C++标准库都放在⼀个叫std(standard)命名空间中。(也就是我们打印程序中用到的std)。

2、命名空间的使用

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找。

例如:

#include <stdio.h>namespace test
{int a = 100;int b = 200;
}int main()
{printf("%d", a);return 0;
}

以上代码会出现一下错误:
在这里插入图片描述

  • 解决方案1:指定命名空间访问
#include <stdio.h>namespace test
{int a = 100;int b = 200;
}int main()
{printf("%d", test::a);return 0;
}

在这里插入图片描述

  • 解决方案2:using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式
#include <stdio.h>namespace test
{int a = 100;int b = 200;
}using test::a;
int main()
{printf("%d",a);return 0;
}

在这里插入图片描述

  • 解决方案3:展开命名空间中全部成员,项目不推荐,冲突风险很大,日常小练习程序为了方便推荐使用。
#include <stdio.h>namespace test
{int a = 100;int b = 200;
}using namespace test;
int main()
{printf("%d",a);return 0;
}

在这里插入图片描述
我们的打印程序就是使用的方案3,将C++标准库全部展开了,即using namespace std;

3、头文件<iostream>是干什么的?

C++编程语言中,<iostream>是一个标准库头文件,它的主要作用是实现基本的输入输出功能,包含了输入输出流相关的定义和声明

其中定义了std::cin(标准输入流对象)相当于C语言中的scanf,定义了std::cout(标准输出流对象)相当于C语言中的printf等等。

  • std::cinistream 对象,它主要面向窄字符(narrow characters (of type char))的标准输入流
  • std::coutostream 对象,它主要面向窄字符标准输出流
  • std::endl 是⼀个函数插入输出时,相当于插入⼀个换行字符加刷新缓冲区

我们在实现第一个程序的时候发现其中有<<符号,这个操作符是流插入运算符,被用于向输出流中去插入数据,相对的>>流提取运算符,被用于从输入流中提取数据

我们还从程序中发现C++中打印时没有使用%d、%f这些符号,这是因为cout输出时会自动识别数据类型,进行相应的转换和输出,不容易出现因格式化字符串与实际数据类型不匹配而导致的错误。而C语言使用%d时,如果不小心将其他类型的数据以 %d 格式输出,可能会导致错误的结果或程序崩溃。

总结:
以上就是本期博客分享的全部内容啦!如果觉得文章还不错的话可以三连支持一下,你的支持就是我前进最大的动力!
技术的探索永无止境! 道阻且长,行则将至!后续我会给大家带来更多优质博客内容,欢迎关注我的CSDN账号,我们一同成长!
(~ ̄▽ ̄)~

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

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

相关文章

1panel第三方应用商店(本地商店)配置和使用

文章目录 引言资源网站实战操作说明 引言 1Panel 提供了一个应用提交开发环境&#xff0c;开发者可以通过提交应用的方式将自己的应用推送到 1Panel 的应用商店中&#xff0c;供其他用户使用。由此衍生了一种本地应用商店的概念&#xff0c;用户可以自行编写应用配置并上传到自…

Evidential Deep Learning和证据理论教材的区别(主要是概念)

最近终于彻底搞懂了Evidential Deep Learning&#xff0c;之前有很多看不是特别明白的地方&#xff0c;原来是和证据理论教材&#xff08;是的&#xff0c;不只是国内老师写的&#xff0c;和国外的老师写的教材出入也比较大&#xff09;的说法有很多不一样&#xff0c;所以特地…

text-decoration: underline;不生效

必须得纪念一下&#xff0c;在给文本加下划线时&#xff0c;发现在win电脑不生效&#xff0c;部分mac也不生效&#xff0c;只有个别的mac生效了&#xff0c;思考了以下几种方面&#xff1a; 1.兼容性问题&#xff1f; 因为是electron项目&#xff0c;不存在浏览器兼容性问题&…

VUE SSR(服务端渲染)

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff0c;一位前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧和知识归纳总结✍。 感谢支持&#x1f495;&#x1f495;&#…

ARCGIS国土超级工具集1.5更新说明

ARCGIS国土超级工具集V1.5版本更新说明&#xff1a;因作者近段时间工作比较忙及正在编写ARCGISPro国土超级工具集&#xff08;截图附后&#xff09;的原因&#xff0c;故本次更新为小更新&#xff08;没有增加新功能&#xff0c;只更新了已有的工具&#xff09;。本次更新主要修…

刘鑫炜履新共工新闻社新媒体研究院院长,赋能媒体融合新征程

2025年4月18日&#xff0c;大湾区经济网战略媒体共工新闻社正式对外宣布一项重要人事任命&#xff1a;聘任蚂蚁全媒体总编刘鑫炜为新媒体研究院第一任院长。这一举措&#xff0c;无疑是对刘鑫炜在新媒体领域卓越专业能力与突出行业贡献的又一次高度认可&#xff0c;也预示着共工…

java基础从入门到上手(九):Java - List、Set、Map

一、List集合 List 是一种用于存储有序元素的集合接口&#xff0c;它是 java.util 包中的一部分&#xff0c;并且继承自 Collection 接口。List 接口提供了多种方法&#xff0c;用于按索引操作元素&#xff0c;允许元素重复&#xff0c;并且保持插入顺序。常用的 List 实现类包…

UWP发展历程

通用Windows平台(UWP)发展历程 引言 通用Windows平台(Universal Windows Platform, UWP)是微软为实现"一次编写&#xff0c;处处运行"的愿景而打造的现代应用程序平台。作为微软统一Windows生态系统的核心战略组成部分&#xff0c;UWP代表了从传统Win32应用向现代应…

git忽略已跟踪的文件/指定文件

在项目开发中&#xff0c;有时候我们并不需要git跟踪所有文件&#xff0c;而是需要忽略掉某些指定的文件或文件夹&#xff0c;怎么操作呢&#xff1f;我们分两种情况讨论&#xff1a; 1. 要忽略的文件之前并未被git跟踪 这种情况常用的方法是在项目的根目录下创建和编辑.gitig…

AI 组件库是什么?如何影响UI的开发?

AI组件库是基于人工智能技术构建的、面向用户界面&#xff08;UI&#xff09;开发的预制模块集合。它们结合了传统UI组件&#xff08;如按钮、表单、图表&#xff09;与AI能力&#xff08;如机器学习、自然语言处理、计算机视觉&#xff09;&#xff0c;旨在简化开发流程并增强…

【Win】 cmd 执行curl命令时,输出 ‘命令管道位置 1 的 cmdlet Invoke-WebRequest 请为以下参数提供值: Uri: ’ ?

1.原因&#xff1a; 有一个名为 Invoke-WebRequest 的 CmdLet&#xff0c;其别名为 curl。因此&#xff0c;当您执行此命令时&#xff0c;它会尝试使用 Invoke-WebRequest&#xff0c;而不是使用 curl。 2.解决办法 在cmd中输入如下命令删除这个curl别名&#xff1a; Remov…

UE5 UE循环体里怎么写延迟

注&#xff1a;需要修改UE循环蓝图节点或者自己新建个蓝图宏库把UE循环节点的原来代码粘贴进去修改。 一、For Loop With Delay 二、For Each Loop With Delay 示例使用&#xff1a; 标注参考出处&#xff1a;分享UE5自制Loop with delay宏&#xff0c;在loop循环中添加执行…

IP检测工具“ipjiance”

目录 IP质量检测 应用场景 对网络安全的贡献 对网络管理的帮助 对用户决策的辅助作用 IP质量检测 检测IP的网络提供商&#xff1a;通过ASN&#xff08;自治系统编号&#xff09;识别IP地址所属的网络运营商&#xff0c;例如电信、移动、联通等。 识别网络类型&#xff1…

[工具]Java xml 转 Json

[工具]Java xml 转 Json 依赖 <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --> <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.37</version> </dependen…

vue3 传参 传入变量名

背景&#xff1a; 需求是&#xff1a;在vue框架中&#xff0c;接口传参我们需要穿“变量名”&#xff0c;而不是字符串 通俗点说法是&#xff1a;在网络接口请求的时候&#xff0c;要传属性名 效果展示&#xff1a; vue2核心代码&#xff1a; this[_keyParam] vue3核心代码&…

spring响应式编程系列:总体流程

目录 示例 程序流程 just subscribe new LambdaMonoSubscriber ​​​​​​​MonoJust.subscribe ​​​​​​​new Operators.ScalarSubscription ​​​​​​​onSubscribe ​​​​​​​request ​​​​​​​onNext 时序图 类图 数据发布者 MonoJust …

基于slimBOXtv 9.16 V2-晶晨S905L3A/ S905L3AB-Mod ATV-Android9.0-线刷通刷固件包

基于slimBOXtv 9.16 V2-晶晨S905L3A&#xff0f; S905L3AB-Mod ATV-Android9.0-线刷通刷固件包&#xff0c;基于SlimBOXtv 9 修改而来&#xff0c;贴近于原生ATV&#xff0c;仅支持晶晨S905L3A&#xff0f; S905L3AB芯片刷机。 适用型号&#xff1a;M401A、CM311-1a、CM311-1s…

使用droidrun库实现AI控制安卓手机

使用droidrun库实现AI控制安卓手机 介绍 DroidRun 是一个框架&#xff0c;通过LLM代理控制 Android 设备。它允许您使用自然语言命令自动化 Android 设备交互。 安装环境 安装源码依赖 git clone https://github.com/droidrun/droidrun.git cd droidrun conda create --nam…

知识库建设全流程指南(AI时代优化版)

知识库建设全流程指南&#xff08;AI时代优化版&#xff09; ​​一、知识库建设的战略定位​​ ​​核心价值锚点​​ ​​AI时代基建​​&#xff1a;知识库是GEO优化的核心载体&#xff0c;决定内容被AI引用的概率权重​​动态护城河​​&#xff1a;结构化知识体系可抵御算…

2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(五级)真题

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;五级&#xff09; 分数&#xff1a;100 题数&#xff1a;38 答案解析&#xff1a;https://blog.csdn.net/qq_33897084/article/details/147341437 一、单选题(共25题&#xff0c;共50分) 1. 以下哪个选…