【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++在领域服务器端、游戏(引擎)、机器学习引擎、音视频处理、嵌入式软件、电信设备、金融应用、基础库、操作系统、编译器、基础架构、基础工具、硬件交互等很多方面都有应用。
大型系统软件开发。如编译器、数据库、操作系统、浏览器等等。
音视频处理。常见的音视频开源库和方案有FFmpeg、WebRTC、Mediasoup、ijkplayer,音视频开发最主要的技术栈就是C++。
PC客户端开发。一般是开发Windows上的桌面软件,比如WPS之类的,技术的话一般是C++和QT,QT是一个跨平台的 C++图形用户界面(Graphical UserInterface,GUl)程序。
服务端开发。各种大型应用网络连接的高并发后台服务。这块Java也比较多,C++主要用于一些对性能要求比较高的地方。如:游戏服务、流媒体服务、量化高频交易服务等
游戏引擎开发。很多游戏引擎就都是使用C++开发的,游戏开发要掌握C++基础和数据结构,学习图形学知识,掌握游戏引擎和框架,了解引擎实现,引擎源代码可以学习UE4、Cocos2d-x等开源引擎实现
嵌入式开发。嵌入式把具有计算能力的主控板嵌入到机器装置或者电子装置的内部,通过软件能够控制这些装置。比如:智能手环、摄像头、扫地机器人、智能音响、门禁系统、车载系统等等,粗略一点,嵌入式开发主要分为嵌入式应用和嵌入式驱动开发。
机器学习引擎。机器学习底层的很多算法都是用C++实现的,上层用python封装起来。如果你只想准备数据训练模型,那么学会Python基本上就够了,如果你想做机器学习系统的开发,那么需要学会C++。
测试开发/测试。每个公司研发团队,有研发就有测试,测试主要分为测试开发和功能测试,测试开发一般是使用一些测试工具(selenium、Jmeter等),设计测试用例,然后写一些脚本进行自动化测试,性能测试等,有些还需要自行开发一些测试用具。功能测试主要是根据产品的功能,设计测试用例,然后手动的方式进行测试。
4. C++学习建议和书籍推荐
4. 1 C++学习难度
首先第一个问题,C++难学吗?
毋庸置疑地说,C++是一个相对难学难精的语言,相比其他一些语言,学习难度要高一些要陡峭一些,这里有历史包袱的问题,也有语言本身设计和发展历史的问题。网上以前流传着下面这个21天内自学精通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;
}
这个代码中由于全局变量int与stdlib.h中的rand()函数命名冲突,所以编译器会给出如下报错:

6. 2 namespace的定义
- 定义命名空间,需要使用到
namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。 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;
}
-
C++中域有函数局部域,全局域,命名空间域,类域。
-
域影响的是编译时语法查找一个变量/函数类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。
-
局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量生命周期。
-
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;
}
- 项目工程中多文件中定义的同名
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文件中定义一样,只不过都要放在名称相同的命名空间中。
- C++标准库的所有函数/变量/类都放在一个叫
std(standard)的命名空间中。不过尽管C++兼容C,但C语言的库在.cpp文件中并不在命名空间中,都存在于全局。
6. 3 命名空间使用
编译查找一个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找。所以下面的情况1会编译报错。
我们要使用命名空间中定义的变量/函数,有三种方式:
- 指定命名空间访问,项目中推荐这种方式。
using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。- 展开命名空间中全部成员,项目不推荐,冲突风险很大,日常小练习程序为了方便推荐使用。
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;
}
//该代码正常运行
情况3:using将某个特定成员展开
#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的报错一样
情况4:using将整个命名空间展开
#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;
}
//该代码正常运行
谢谢你的阅读,喜欢的话来个点赞收藏评论关注吧!
我会持续更新更多优质文章
相关文章:
【C++】入门基础介绍(上)C++的发展历史与命名空间
文章目录 1. 前言2. C发展历史2. 1 C版本更新特性一览2. 2 关于C23的一个小故事: 3. C的重要性3. 1 编程语言排行榜3. 2 C在工作领域中的应用 4. C学习建议和书籍推荐4. 1 C学习难度4. 2 学习书籍推荐 5. C的第一个程序6. 命名空间6. 1 namespace的价值6. 2 namespace的定义6. …...
dll动态库加载失败导致程序启动报错以及dll库加载失败的常见原因分析与总结
目录 1、问题说明 2、dll库的隐式加载与动态加载 2.1、dll库的隐式加载 2.2、dll库的显式加载 3、使用Process Explorer查看进程加载的dll库信息以及动态加载的dll库有没有加载成功 3.1、使用Process Explorer查看进程加载的dll库信息 3.2、使用Process Explorer查看动态…...
SAP MM学习笔记 - 豆知识10 - OMSY 初期化会计期间,ABAP调用MMPV/MMRV来批量更新会计期间(TODO)
之前用MMRV,MMPV来一次一个月来修改会计期间。 如果是老的测试机,可能是10几年前的,一次1个月,更新到当前期间,搞个100多次,手都抖。 SAP MM学习笔记 - 错误 M7053 - Posting only possible in periods 2…...
Pytorch实现RNN实验
一、实验要求 用 Pytorch 模块的 RNN 实现生成唐诗。要求给定一个字能够生成一首唐诗。 二、实验目的 理解循环神经网络(RNN)的基本原理:通过构建一个基于RNN的诗歌生成模型,学会RNN是如何处理序列数据的,以及如何在…...
四、Drf认证组件
四、Drf认证组件 4.1 快速使用 from django.shortcuts import render,HttpResponse from rest_framework.response import Response from rest_framework.views import APIView from rest_framework.authentication import BaseAuthentication from rest_framework.exception…...
C++:静态成员
静态成员涉及到的关键字尾static 静态成员变量要在类外初始化 去掉static关键字类型类名::变量名 静态成员变量不属于任何对象 所有对象共享一份 静态成员可以不通过对象直接访问 类名::成员名 静态成员依旧受访问修饰符的约束 …...
28 Vue3之搭建公司级项目规范
可以看到保存的时候ref这行被提到了最前面的一行 要求内置库放在组件的前面称为auto fix,数组new arry改成了字面量,这就是我们配置的规范 js规范使用的是airbnb规范模块使用的是antfu 组合prettier&eslint airbnb规范: https://github…...
【pytorch】张量求导3
再接上文,补一下作者未补完的矩阵运算的坑。 首先贴一下原作者的图,将其转化为如下代码: import torch import torch.nn as nn import torch.optim as optim# 定义一个简单的两层神经网络 class TwoLayerNet(nn.Module):def __init__(self):super(TwoLayerNet, self).__in…...
Servlet——springMvc底层原理
我们也先了解一下什么的动态资源,什么是静态资源。 静态资源:无需程序运行就可以获取的资源(照片、html、css、js等) 动态资源:需要通关程序运行才可以获得的资源。 (其实动态、静态的资源都与Servlet有…...
Json 在线可视化工具,分享几个
文章目录 1.json.cn2.json4u.cn3.jsonvisual.com4.jsoncrack5.altearius.github.io6.json.wanvb.com 前序:本文是对多种 Json 在线可视化工具 的介绍、分享。Json官网 https://www.json.org/json-en.html 个人比较中意第四款: https://jsoncrack.com/ed…...
LLM | llama.cpp 安装使用(支持CPU、Metal及CUDA的单卡/多卡推理)
1. 详细步骤 1.1 安装 cuda 等 nvidia 依赖(非CUDA环境运行可跳过) # 以 CUDA Toolkit 12.4: Ubuntu-22.04/24.04(x86_64) 为例,注意区分 WSL 和 Ubuntu,详见 https://developer.nvidia.com/cuda-12-4-1-download-archive?targ…...
矩阵求解复数(aniwoth求解串扰)
所以这种求解串扰的格式是因为,有串扰的共轭项在方程组中 复数共轭项的作用,但是这是二次方程,...
Redis: Sentinel哨兵监控架构及环境搭建
概述 在主从模式下,我们通过从节点只读模式提高了系统的并发能力并发不断增加,只需要扩展从节点即可,只要主从服务器之间,网络连接正常主服务器就会将写入自己的数据同步更新给从服务器,从而保证主从服务器的数据相同…...
C++ 语言特性30 - 模板介绍
目录 一:C11 之前的模板特性 1. 函数模板: 2. 类模板: 3. 模板特化: 4. 模板参数: 5. 模板元编程: 二:C11的模板特性 1. 变长模板(Variadic Templates)ÿ…...
算法笔记(七)——哈希表
文章目录 两数之和判定是否互为字符重排存在重复元素存在重复元素 II字母异位词分组 哈希表:一种存储数据的容器; 可以快速查找某个元素,时间复杂度O(1); 当频繁查找某一个数时,我们可以使用哈希表 创建一个容器&#…...
【基础算法总结】链表篇
目录 一, 链表常用技巧和操作总结二,算法原理和代码实现2.两数相加24.两两交换链表中的节点143.重排链表23.合并k个升序链表25.k个一组翻转链表 三,算法总结 一, 链表常用技巧和操作总结 有关链表的算法题也是一类常见并且经典的题…...
探索路由器静态IP的获取方式
在网络配置中,路由器静态IP是一个重要的概念。对于家庭网络或办公室网络而言,正确配置静态IP地址是确保网络稳定性和管理的关键步骤之一。但是,很多人对于静态IP地址的获取方式可能感到困惑。在本文中,我们将探讨它的获取途径&…...
Vivado - JTAG to AXI Master (GPIO、IIC、HLS_IP)
目录 1. 简介 2. JTAG to AXI Master 2.1 添加 IP Core 2.2 基本TCL命令 2.2.1 复位 JTAG-to-AXI Master 2.2.2 创建并运行写入传输事务 2.2.3 创建并运行读取传输事务 2.2.4 命令列表 2.3 帮助信息 2.4 创建TCL读写程序 2.4.1 Read proc 2.4.2 Write proc 2.4.3 …...
Java中JWT(JSON Web Token)的运用
目录 1. JWT的结构2. JWT的优点3. JWT的流转过程4.具体案例一、项目结构二、依赖配置三、用户模型四、JWT工具类五、JWT请求过滤器六、安全配置七、身份验证控制器八、测试JWT JWT(JSON Web Token)是一种开放标准(RFC 7519)&#…...
CSS3练习--电商web
免责声明:本文仅做分享! 目录 小练--小兔鲜儿 目录构建 SEO 三大标签 Favicon 图标 布局网页 版心 快捷导航(shortcut) 头部(header) logo 导航 搜索 购物车 底部(footer࿰…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
