【C++】入门基础介绍(上)C++的发展历史与命名空间

文章目录

  • 1. 前言
  • 2. C++发展历史
    • 2. 1 C++版本更新特性一览
    • 2. 2 关于C++23的一个小故事:
  • 3. C++的重要性
    • 3. 1 编程语言排行榜
    • 3. 2 C++在工作领域中的应用
  • 4. C++学习建议和书籍推荐
    • 4. 1 C++学习难度
    • 4. 2 学习书籍推荐
  • 5. C++的第一个程序
  • 6. 命名空间
    • 6. 1 namespace的价值
    • 6. 2 namespace的定义
    • 6. 3 命名空间使用


1. 前言

在C++系列博客正式开始之前,我认为有必要了解一下关于C++的一些发展历程以及一些比较细碎但重要的C++和C语言的差异。

2. C++发展历史

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

图为本贾尼博士
本贾尼博士

本贾尼博士

2. 1 C++版本更新特性一览

版本特性概览
C++98 (1998)第一个标准化的C++版本。
C++03 (2003)修订了C++98标准,增加了一些新特性,如可选的具体模板实例化 (SSP)。
C++11 (2011)引入了许多新特性,如列表初始化、自动类型推导、右值引用、lambda表达式、智能指针等。
C++14 (2014)在C++11基础上进一步增加了一些新特性,主要是对C++11的小修小补。
C++17 (2017)引入了很多新特性,如inline变量、fold表达式、if和switch控制语句中的初始化器等。
C++20 (2020)引入了许多重要的新特性,如范围for循环、模块、协程、原始字符串字面量等。

时间轴

2. 2 关于C++23的一个小故事:

C++一直被诟病的一个地方就是没有网络库(networking,用于网络通信,使用频率极高),networking之前是在C++23的计划中的,但是现在C++23发布之后却没有networking,在网上引发了一系列的吐槽。
网图
网图
网图
过程确实很精彩,但很遗憾结果就是networking并没有出现在C++23上,C++作为面向底层的语言,实际生产中使用的版本迭代速度是远远慢于新标准制定的,所以想正式使用networking,恐怕还有很长一段时间。

3. C++的重要性

3. 1 编程语言排行榜

TIOBE排行榜是根据互联网上有经验的程序员、课程和第三方厂商的数量,并使用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube和Baidu(百度)统计出排名数据,只是反映某个编程语言的热门程度,并不能说明一门编程语言好不好,或者一门语言所编写的代码数量多少。
2024年9月TIOBE发布的编程语言排行榜
排行榜
可以看到C++具有十分高的热度,目前排在所有编程语言中的第二名。
当然这个榜单的可信度并不强,在之前很长的一段时间中,C语言一直都是高于C++的,但现在C语言却以不小的劣势掉出了前三。看看就好,不必较真

3. 2 C++在工作领域中的应用

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

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

  2. 音视频处理。常见的音视频开源库和方案有FFmpeg、WebRTC、Mediasoup、ijkplayer,音视频开发最主要的技术栈就是C++。

  3. PC客户端开发。一般是开发Windows上的桌面软件,比如WPS之类的,技术的话一般是C++和QT,QT是一个跨平台的 C++图形用户界面(Graphical UserInterface,GUl)程序。

  4. 服务端开发。各种大型应用网络连接的高并发后台服务。这块Java也比较多,C++主要用于一些对性能要求比较高的地方。如:游戏服务、流媒体服务、量化高频交易服务等

  5. 游戏引擎开发。很多游戏引擎就都是使用C++开发的,游戏开发要掌握C++基础和数据结构,学习图形学知识,掌握游戏引擎和框架,了解引擎实现,引擎源代码可以学习UE4、Cocos2d-x等开源引擎实现

  6. 嵌入式开发。嵌入式把具有计算能力的主控板嵌入到机器装置或者电子装置的内部,通过软件能够控制这些装置。比如:智能手环、摄像头、扫地机器人、智能音响、门禁系统、车载系统等等,粗略一点,嵌入式开发主要分为嵌入式应用和嵌入式驱动开发。

  7. 机器学习引擎。机器学习底层的很多算法都是用C++实现的,上层用python封装起来。如果你只想准备数据训练模型,那么学会Python基本上就够了,如果你想做机器学习系统的开发,那么需要学会C++。

  8. 测试开发/测试。每个公司研发团队,有研发就有测试,测试主要分为测试开发和功能测试,测试开发一般是使用一些测试工具(selenium、Jmeter等),设计测试用例,然后写一些脚本进行自动化测试,性能测试等,有些还需要自行开发一些测试用具。功能测试主要是根据产品的功能,设计测试用例,然后手动的方式进行测试。

4. C++学习建议和书籍推荐

4. 1 C++学习难度

首先第一个问题,C++难学吗?
毋庸置疑地说,C++是一个相对难学难精的语言,相比其他一些语言,学习难度要高一些要陡峭一些,这里有历史包袱的问题,也有语言本身设计和发展历史的问题。网上以前流传着下面这个21天内自学精通C++的梗。
自学C++
尽管C++的学习难度不算小,但我会竭尽全力把每一篇博客写好,如果你刚刚开始学习C++,不妨关注我,我会持续带来更多的优质博客。

4. 2 学习书籍推荐

书籍
C++ Primer:主要讲解语法,经典的语法书籍,前后中期都可以看,前期如果自学看可能会有点晦涩难懂,能看懂多少看懂多少,中后期可以作为语法字典,非常好用。

STL源码剖析:主要从底层实现的角度庖丁解牛式地剖析STL的实现,是侯捷老师的经典之作。可以很好的帮助我们学习别人用语法是如何实现出高效简洁的数据结构和算法代码,如何使用泛型封装等。可以让我们不再坐井观天,闭门造车,中后期可以看。

Effctive C++:本书也是侯捷老师翻译的,本书有的一句评价,可以把C++程序员分为看过此书的和没看过此书的。本书主要讲了55个如何正确高效使用C++的条款,建议中后期可以看一遍,工作1-2年后再看一遍,相信会有不一样的收获。

好的,那么关于C++的一些基础情况就说到这里,下面开始正式的入门基础知识。

5. C++的第一个程序

C++兼容C语言绝大多数的语法,所以C语言实现的hello world依旧可以运行,C++文件需要把文件后缀改为.cpp,编译器看到是.cpp就会调用C++编译器编译,Linux下要用g++编译,不再是gcc

你当然可以完全使用C语言的语法去实现第一个C++程序Hello World,但是严格地说,纯C++版本的Hello Word! 应该是这样写的:

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

或是

#include<iostream>
int main()
{std::cout << "Hello World!" << std::endl;return 0;
}

二者是等价的。正如当初初学C语言时看不懂Hello World程序一样,这个你多半也看不明白,本文接下来的内容就会将这个程序解释清楚。

6. 命名空间

6. 1 namespace的价值

在C/C++中,变量函数和后面讲到的都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突
c语言项目出现类似下面的程序的命名冲突是普遍存在的问题,C++引入namespace就是为了解决这样的问题,使用命名空间的可以对标识符的名称进行本地化,以避免命名冲突或名字污染。

#include<stdio.h>
#include<stdlib.h>	//这个头文件中包含rand()函数
int rand = 0;
int main()
{printf("%d", rand);return 0;
}

这个代码中由于全局变量intstdlib.h中的rand()函数命名冲突,所以编译器会给出如下报错:
报错

6. 2 namespace的定义

  1. 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
  2. namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不再冲突了。
//创建一个命名空间使 rand变量不与 rand函数冲突
#include<stdio.h>
#include<stdlib.h>namespace fhvyxyci
{//变量int rand = 10;//函数int add(int a, int b){return a + b;}//类型,以struct结构体举例,尽管它在C++中有更好的上位替代struct fh{int v;double y;};//typedef 一个类型typedef int my_int;
}int main()
{printf("%p\n", rand);			//这里访问的是stdlib.h中的rand()函数的地址printf("%d", fhvyxyci::rand);	//::操作符用于访问命名空间中的成员,这里访问的是命名空间fhvyxyci中的rand变量return 0;
}
  1. C++中域有函数局部域全局域命名空间域类域

  2. 域影响的是编译时语法查找一个变量/函数类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。

  3. 局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量生命周期。

  4. namespace只能定义在全局,当然它还可以嵌套定义

#include<stdio.h>
#include<stdlib.h>
namespace fhvyxyci
{namespace fhvy{int rand = 10;;}namespace xyci{int rand = 11;}
}
int main()
{printf("%d\n", fhvyxyci::fhvy::rand);printf("%d\n", fhvyxyci::xyci::rand);printf("%p\n", rand);return 0;
}
  1. 项目工程中多文件中定义的同名namespace会认为是一个namespace,不会冲突。
//test.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
namespace fhvyxyci
{int rand = 11;double fh = 10;int add(int a, int b);
}//test.cpp
#include"test.h"
namespace fhvyxyci
{int add(int a, int b){return a + b;}
}int main()
{printf("%d\n", fhvyxyci::rand);printf("%lf\n", fhvyxyci::fh);printf("%d\n", fhvyxyci::add(1, 2));return 0;
}

这个代码可以正常地运行,函数之间就如同正常的在头文件声明,.cpp文件中定义一样,只不过都要放在名称相同的命名空间中。

  1. C++标准库的所有函数/变量/类都放在一个叫std(standard)的命名空间中。不过尽管C++兼容C,但C语言的库在.cpp文件中并不在命名空间中,都存在于全局

6. 3 命名空间使用

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

  1. 指定命名空间访问,项目中推荐这种方式。
  2. using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。
  3. 展开命名空间中全部成员,项目不推荐,冲突风险很大,日常小练习程序为了方便推荐使用。

using是C++的一个关键字,用于展开命名空间,使用方式请参考下面的4种情况。
当要在命名空间之外对命名空间中的成员进行任何操作,如访问,调用时,均使用::操作符。

情况1:未做任何对应措施就尝试访问命名空间中的内容

#include<stdio.h>
namespace fhvyxyci
{int a = 10;int b = 11;
}int main()
{printf("%d\n", a);return 0;
}

编译器给出报错:
报错
情况2:指定命名空间访问

#include<stdio.h>
namespace fhvyxyci
{int a = 10;int b = 11;
}int main()
{printf("%d\n", fhvyxyci::a);	// ::操作符用于访问命名空间中的成员printf("%d\n", fhvyxyci::b);return 0;
}
//该代码正常运行

情况3using将某个特定成员展开

#include<stdio.h>
namespace fhvyxyci
{int a = 10;int b = 11;
}
//展开命名空间fhvyxyci中的成员b,不需要指出类型
using fhvyxyci::b;int main()
{printf("%d\n", a);printf("%d\n", b);return 0;
}
//该代码报错,与情况1的报错一样

情况4using将整个命名空间展开

#include<stdio.h>
namespace fhvyxyci
{int a = 10;int b = 11;
}
//展开整个命名空间fhvyxyci
using namespace fhvyxyci;
int main()
{printf("%d\n", a);printf("%d\n", b);return 0;
}
//该代码正常运行

谢谢你的阅读,喜欢的话来个点赞收藏评论关注吧!
我会持续更新更多优质文章

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

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

相关文章

首届中美可持续发展峰会在加州圆满举行,引领国际绿色发展新方向

现场嘉宾与(部分)与会人员大合影 2024年8月18日,由美国领创商业联盟(Youth Entrepreneur Business Alliance, YEBA)主办的首届中美可持续发展峰会(Sino-American Symposium on Sustainable Development)在加州森林湖市(Lake Forest)盛大举行。此次峰会吸引了数百名来自中美两国…

HTML+CSS之表格(15个案例+代码+效果图+素材)

目录 1.table标签的border属性 案例:制作一个带边框的表格 1.代码 2.效果 2.table标签的cellspacing属性 案例:制作一个带边距的表格 1.代码 2.效果 3.table标签的cellpadding属性 1.代码 2.效果 4.table标签的width和height属性 案例:指定宽高的表格 1.代码 2.效果 5.table标签…

全新芒果YOLOv10改进135:最新注意力机制EMA:即插即用,具有跨空间学习的高效多尺度注意力模块,ICCASSP 2023

💡本篇内容:芒果YOLOv10改进135:最新注意力机制EMA:即插即用,具有跨空间学习的高效多尺度注意力模块,ICCASSP 2023 **具有跨空间学习的高效多尺度注意力模块EMA | 即插即用 该模块通常包括多个并行的注意力子模块,每个子模块关注于输入数据的不同尺度或分辨率。这些子模块…

HTML+CSS表单控件(11个案例+代码+效果图)

目录 单行文本框 (text) 案例:制作一个单行文本框 1.代码 2.效果 密码输入框 (password) 案例:制作密码输入框 1.代码 2.效果 单选按钮 (radio) 案例:制作单选按钮 1.代码 2.效果 复选框 (checkbox) 案例:制作一个复选框 1.代码 2.效果 普通按钮 (button) 案例:制作一个普通按钮…

Java毕业设计实战项目之基于SSM框架的民宿预定系统

项目技术架构&#xff1a; 该SSMVue的民宿预定系统&#xff0c;后端采用SSM架构&#xff0c;前端采用VueElementUI实现页面的快速开发&#xff0c;并使用关系型数据库MySQL存储系统运行数据。本系统分为三种角色&#xff0c;分别是系统管理员&#xff0c;用户&#xff0c;房主…

RD-Agent Windows安装教程

RD-Agent Windows安装教程 QuantML QuantML 2024年09月23日 18:30 Content RD-Agent 是微软亚洲研究院推出的一款自动化研究与开发工具&#xff0c;能够通过LLMs自动构建因子和策略&#xff0c;相关介绍见我们之前的文章&#xff1a;RD-Agent &#xff1a;自动化Quant工厂 然…

10.5二分专练,二分边界情况,+1不加1的判断,方向判断,各种DEBUG

5 https://leetcode.cn/problems/minimum-speed-to-arrive-on-time/submissions/570242512/ 就是说总时间是 前n-1量汽车的运行时间&#xff0c;向上取整&#xff0c;然后再加上最后一辆列车的运行时间 最快的话是需要n-1个小时 搜索空间就是时速&#xff0c;左边界是1&#x…

windows中下载、安装、配置JDK/JDK环境配置/Java配置环境变量/Linux中安装配置JDK环境

JDK下载(官网)、安装、配置(包括系统、idea、eclipse)一篇就够了 1、问题概述? Java开发者必须掌握的JDK下载、安装、配置过程。 包括在Eclipse及IDEA中的配置使用 2、下载JDK 【注册Oracle官网账号】 下载的前天是注册orcle官网账号,作为开发者,这个必须有,随时关注…

VBA信息获取与处理第三个专题第三节:工作薄在空闲后自动关闭

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…

Web安全 - 路径穿越(Path Traversal)

文章目录 OWASP 2023 TOP 10导图定义路径穿越的原理常见攻击目标防御措施输入验证和清理避免直接拼接用户输入最小化权限日志监控 ExampleCode漏洞代码&#xff1a;路径穿越攻击案例漏洞说明修复后的安全代码代码分析 其他不同文件系统下的路径穿越特性Windows系统类Unix系统&a…

记录|Modbus-TCP产品使用记录【摩通传动】

目录 前言一、摩通传动实验图1.1 配置软件 IO_Studio1.2 测试软件Modbus Poll1.2.1 读写设置测试1.2.2 AI信号的读取 1.3 对应的C#连接Modbus的测试代码如下【自制&#xff0c;仅供参考】1.4 最终实验图 更新时间 前言 参考文章&#xff1a; 自己需要了解和对比某些产品的Modbu…

【MySQL】服务器管理与配置

MySQL服务器 服务器默认配置 查看服务器默认选项和系统变量 mysqld --verbose --help 查看运行时的系统变量&#xff0c;可以通过like去指定自己要查询的内容 状态变量的查看 系统变量和状态变量的作用域 全局作用域&#xff1a; 对于每个会话都会生效当前会话&#xff1a;只…

初识算法 · 滑动窗口(1)

目录 前言&#xff1a; 长度最小的子数组 题目解析 算法原理 算法编写 无重复长度的最小字符串 题目解析 算法原理 算法编写 前言&#xff1a; 本文开始&#xff0c;介绍的是滑动窗口算法类型的题目&#xff0c;滑动窗口本质上其实也是双指针&#xff0c;但是呢&#…

异常处理【C++提升】(基本思想,重要概念,异常处理的函数机制、异常机制,栈解旋......你想要的全都有)

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; C系列语法知识_Stark、的博客-CSDN博客 座右铭&#xff1a;梦想是一盏明灯&#xff0c;照亮我们前行的路&#xff0c;无论风雨多大&#xff0c;我们都要坚持不懈。 异…

828华为云征文|华为云Flexus云服务器X实例搭建部署H5美妆护肤分销商城、前端uniapp

准备国庆之际&#xff0c;客户要搭个 H5 商城系统&#xff0c;这系统好不容易开发好啦&#xff0c;就差选个合适的服务器上线。那可真是挑花了眼&#xff0c;不知道哪款性价比高呀&#xff01;就像在琳琅满目的选择前。最终慧眼识珠&#xff0c;选择了华为云 Flexus X。至于为什…

redis高级篇 抢红包案例的设计以及分布式锁

一 抢红包案例 1.1 抢红包 二倍均值算法&#xff1a; M为剩余金额&#xff1b;N为剩余人数&#xff0c;公式如下&#xff1a; 每次抢到金额随机区间&#xff08;0&#xff0c;&#xff08;M/N&#xff09;*2&#xff09; 这个公式&#xff0c;保证了每次获取的金额平均值…

TX-LCN框架 分布式事务

一、三种事务模式 1&#xff09;LCN 基于XA协议&#xff0c;事务提交或回滚的操作由事务管理服务器统一告诉它管理的多个项目&#xff0c;也就是说在A事务&#xff0c;B事务的事务提交操作或回滚操作都是在同一时刻发生&#xff0c;并且要么都提交&#xff0c;要么都回滚。 LCN…

低代码可视化-UniApp二维码可视化-代码生成器

市面上提供了各种各样的二维码组件&#xff0c;做了一简单的uniapp二维码组件&#xff0c;二维码实现依赖davidshimjs/qrcodejs。 组件特点 跨浏览器支持&#xff1a;利用Canvas元素实现二维码的跨浏览器兼容性&#xff0c;兼容微信小程序、h5、app。 无依赖性&#xff1a;QR…

数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(一).创建基础表

一. 使用工具和命令 1.1 使用的工具 Navicat Premium 17 &#xff1a;“Navicat”是一套可创建多个连接的数据库管理工具。 MySQL版本8.0.39 。 1.2 使用的命令 Navicat中使用的命令 命令命令解释SHOW DATABASES&#xff1b;展示所有的数据库CREATE DATABASE 数据库名称; 创…

震动传感器介绍及实战

目录 前言 震动传感器 1.震动传感器配图 2.震动传感器原理图 3.震动传感器使用 1-震动传感器的意义 2-震动传感器的应用场景 3- SW-18010P震动传感器使用方法 震动传感器控制灯 操作 增加延时 使用SPC-ISP生成演示函数 总结 前言 我们上节已经简单了解了LED的使用…