【落羽的落羽 C++】C++入门基础·其之一

文章目录
- 一、C++简介
- 1. C++的发展历史
- 2. C++参考文档
- 二、namespace命名空间
- 1. C语言的一个缺陷
- 2. namespace
- 3. 命名空间的使用
- 3.1 命名空间成员访问
- 3.2 using展开
一、C++简介
1. C++的发展历史
C++起源于1979年的贝尔实验室,Bjarne Stroustrup(本贾尼博士)在那里从事计算机科学和软件工程的研究工作。面对项目中复杂的软件开发任务,他感受到了现有编程语言(如C语言)在表达能力、可维护性、可扩展性方面的不足。他在1983年在C语言的基础上添加了面对对象编程的特性。设计出了C++的雏形,此时的C++已经有了类、封装、继承等核心概念。
随后的几年中,C++在学术界和工业界的应用逐渐增多,一些大学和研究所开始将C++作为教学和科研的首选语言,一些公司开始在产品开发中尝试使用C++。这一时期C++的标准库和模板等特性也得到了进一步的完善和发展。
C++的标准化于1989年开始,当时成立了一个ANSI和ISO国际标准化组织的联合标准化委员会。1994年标准化委员会提出了C++标准化的第一个草案。不久,惠普实验室开发了一系列软件,统称为STL(Standard Template Library),联合标准化委员会投票通过了将STL包含在C++标准的提议。但STL对C++的扩展超出了C++最初定义标准范围,虽然在标准中加入STL是个重要的决定,但也因此延缓了C++的标准化进程。
直到1997年11月14日,联合标准化委员会通过了该标准的最终草案。1998年,C++的ANSI/ISO标准被投入使用。
而每隔几年,C++都会迎来一次版本更新,如1998年的C++98、2003年的C++03、2011年的C++11、2014年的C++14……目前2026年的C++26正在制定中。
一句话总结:C++是一门扩展了C语言的语言,它兼容C语言的大部分语法
2. C++参考文档
https://legacy.cplusplus.com/reference
https://en.cppreference.com/w/
https://zh.cppreference.com/w/cpp
这三个网站是C++程序设计者最常用的C++参考文档。
第一个我们已经不陌生了,在C语言学习阶段经常去查询库函数:

然而它并不是C++的官方文档,是“民间大神”建设的科普性网站。在UI和用户访问方面相比官方文档改进了不少。缺点是它太久没有更新,内容很老甚至可能不是正确的了。
第二个网站就是C++的官方文档,是全英文的,也是最推荐大家学习的。第三个网站是官方文档的翻译版。我们鼓励大家还是阅读官方文档,因为作为程序员培养英文文档阅读能力还是很重要的,有一些知识与技术可能并没有汉化,要依靠自己去查询学习。



二、namespace命名空间
1. C语言的一个缺陷
还记得我们讲过:作用域是一个程序设计概念。通常来说,针对每一个变量,都有它的可用的范围,这就是作用域。C语言中我们只接触到了全局域、局部域,而在同一个域中不能出现相同名字的变量或函数或类型,否则会编译报错。在大型的项目中,可能要用到成千上万个函数,团队多人协作时经常会有起名冲突的问题,这是C语言无法解决的问题。
2. namespace
所以,C++克服了这一问题,提出了命名空间这一概念。定义命名空间,需要用关键字namespace,后面加自定义空间名字,接上一对{ },{ }中即为命名空间的成员,可以定义变量、函数、类型。
tip:进入C++的学习,记得创建源文件后缀是 .cpp 哦
namespace test //test是自定义名字
{int a = 1;void Swap(int* x, int* y){*x = *x ^ *y;*y = *x ^ *y;*x = *x ^ *y;}struct st{int n;char m;};
}
namespace的本质是定义了一个域,和其他局部域、全局域相互独立。既然它们是不同的域,完全可以在各自其中定义相同名字的变量或函数或结构了。举个例子:
#include"test.h"
int a = 2;
int main()
{return 0;
}
//如果test.h中有:int a;则程序会报错
//如果test.h中有:namespace test{ int a; }不会报错
//前者程序中的全局域中出现了两次定义a(头文件中一次主函数上面一次),
//后者的全局域和命名空间域各只出现了一次定义a


C++中域有全局域、函数局部域、命名空间域、类域。域影响的是编译时语法查找一个变量或函数或类型出处的逻辑,所以在一个域内出现的相同名字会使语法无法判断。有了域隔离,名字冲突就解决了。除此之外,局部域和全局域还会影响变量的生命周期,而命名空间域和类域的变量生命周期默认是整个程序的生命周期。
我们还要知道的是:
- namespace只能定义在全局,不能定义在函数里。
- namespace可以嵌套定义。
- 项目工程中多文件中定义的同名namespace会被认为是一个namespace,会被程序自动合并,不会冲突。
- C++标准库都放在一个叫std(standard)的命名空间中。
//namespace的嵌套定义
namespace MiHoYo
{int a = 10;char c = 'Q';namespace Honkai_3{int a = 1;char c = 'X';}namespace Genshen_Impact{int a = 4;char c = 'J';}namespace Honkai_Star_Rail{int a = 9;char c = 'O';}
}
3. 命名空间的使用
3.1 命名空间成员访问
访问命名空间的操作符是::,使用方式和结构体的. ->很像。
比如,语句test::a,是从命名空间test中找变量a;::a默认是从全局域中找变量a;而a就是先从局部域找a,找不到再从全局域找a。函数或类型也同理
代码示例:
#include<stdio.h>namespace test1
{int a = 1;namespace test2{int a = 2;}
}int a = 3;int main()
{int a = 4;printf("%d\n", test1::a); //访问test1的aprintf("%d\n", test1::test2::a); //访问test1中的test2中的aprintf("%d\n", ::a); //默认访问全局域的aprintf("%d\n", a); //访问局部域的a,局部域没有a则访问全局域的areturn 0;
}

函数也是一样的:
#include<stdio.h>namespace test
{int a = 2;int b = 8;int Add(int x, int y){return x + y;}
}int main()
{printf("%d", test::Add(test::a, test::b));return 0;
}

3.2 using展开
C++中还有一个关键字using,能将命名空间成员展开,即让这个成员从命名空间中“出来”到全局域中,相当于全局域中再定义了一次,原命名空间仍保留成员。使用方法是using 命名空间名::成员名;,如:
namespace test
{int a = 1;char c = 'P';
}
using test::a; //这一句可以看做int a = 1;
void main()
{printf("%d ", a);printf("%d ", test::a);//两者结果相同
}

但是,展开了a相当于还是在全局域中定义了a,又带来了命名冲突的风险。所以只有项目中经常访问不存在冲突的成员推荐这种方式。
特别地,using namespace test;可以将命名空间test的全部成员都展开:

然而,展开命名空间中的全部成员,命名冲突风险很大,项目中不推荐。只有我们的日常小练习中方便推荐使用。

本篇完,感谢阅读~
相关文章:
【落羽的落羽 C++】C++入门基础·其之一
文章目录 一、C简介1. C的发展历史2. C参考文档 二、namespace命名空间1. C语言的一个缺陷2. namespace3. 命名空间的使用3.1 命名空间成员访问3.2 using展开 一、C简介 1. C的发展历史 C起源于1979年的贝尔实验室,Bjarne Stroustrup(本贾尼博士&#…...
docker使用代理的简单配置
1准备代理服务器 准备代理服务器,例如192.168.120.168:52209 配置docker.service文件 查看service文件的位置 systemctl status docker 编辑service文件 vim /usr/lib/systemd/system/docker.service 添加代理配置 ... [Service] Environment"HTTP_PROXY…...
每日一题-设计食物评分系统,哈希表的有效使用
本题出自LeetCode2353.设计食物评分系统,连着一星期都是设计类的题目哈 题目 设计一个支持下述操作的食物评分系统: 修改 系统中列出的某种食物的评分。返回系统中某一类烹饪方式下评分最高的食物。 实现 FoodRatings 类: FoodRatings(Strin…...
大模型应用:多轮对话(prompt工程)
概述 在与大型语言模型(如ChatGPT)交互的过程中,我们常常体验到与智能助手进行连贯多轮对话的便利性。那么,当我们开启一个新的聊天时,系统是如何管理聊天上下文的呢? 一、初始上下文的建立 1. 创建新会…...
WSDM24-因果推荐|因果去偏的可解释推荐系统
1 动机 可解释推荐系统(ERS)通过提供透明的推荐解释,提高用户信任度和系统的说服力,如下图所示,然而: 1:现有工作主要关注推荐算法的去偏(流行度偏差),但未显…...
VScode在Windows11中配置MSVC
因为MSVC编译器在vs当中,所以我们首先要安装vs的一部分组件。如果只是需要MSVC的话,工作负荷一个都不需要勾选,在单个组件里面搜索MSVC和windows11 SDK,其中一个是编译器,一个是头文件然后右下角安装即可。搜索Develop…...
数据库基础二(数据库安装配置)
打开MySQL官网进行安装包的下载 https://www.mysql.com/ 接着找到适用于windows的版本 下载版本 直接点击下载即可 接下来对应的内容分别是: 1:安装所有 MySQL 数据库需要的产品; 2:仅使用 MySQL 数据库的服务器; 3&a…...
cuda-12.4.0 devel docker 中源码安装 OpenAI triton
1,准备 docker 容器 下载docker image: $ sudo docker pull nvidia/cuda:12.6.2-devel-ubuntu20.04 创建容器: sudo docker run --gpus all -it --name cuda_LHL_01 -v /home/hongleili/ex_triton/tmp1:/root/ex_triton/tmp1 nvidia/cuda:12.6…...
doris: Hive Catalog
通过连接 Hive Metastore,或者兼容 Hive Metatore 的元数据服务,Doris 可以自动获取 Hive 的库表信息,并进行数据查询。 除了 Hive 外,很多其他系统也会使用 Hive Metastore 存储元数据。所以通过 Hive Catalog,我们不…...
【LeetCode】131.分割回文串
目录 题目描述输入输出示例及数据范围思路C 实现 题目描述 这道题目来自 LeetCode 131. 分割回文串。 题目描述如下: 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 输入输出示例及数据…...
JeeWMS graphReportController.do SQL注入漏洞复现(CVE-2025-0392)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...
基于Python+django+mysql旅游数据爬虫采集可视化分析推荐系统
2024旅游推荐系统爬虫可视化(协同过滤算法) 基于Pythondjangomysql旅游数据爬虫采集可视化分析推荐系统 有文档说明 部署文档 视频讲解 ✅️基于用户的协同过滤推荐算法 卖价就是标价~ 项目技术栈 Python语言、Django框架、MySQL数据库、requests网络爬虫…...
我的工作经历
主要说一下毕业工作大半年了一些心得与想法。 首先是因为本科不好的原因,单2硕士找了一个国企(其实应该说是央企)。也幸好找的是央企,后续工作基本上没有强度,不然后期神经衰弱抑郁症家里乱七八糟催婚的事情能把人逼疯…...
筑牢安全防线:工商业场所燃气泄漏防护新方案
燃气安全是企业经营不可逾越的生命线。在餐饮后厨、化工车间、酒店锅炉房等场所,可燃气体一旦泄漏,极易引发严重事故。如何实现精准监测、快速响应,成为工业及商业领域安全管理的核心诉求。旭华智能深耕安全监测领域,推出的工业及…...
基于STM32的智能停车场管理系统
1. 引言 传统停车场管理存在车位利用率低、停车体验差等问题,难以满足现代城市停车需求。本文设计了一款基于STM32的智能停车场管理系统,通过车位状态实时监测、智能导航与无感支付技术,实现停车资源的高效利用与用户服务的全面升级。 2. 系…...
MacBook 终端中使用 vim命令
在 MacBook 终端中使用 vim 编辑器时,以下是一些常用命令和操作指南: 1. 基本操作 启动 vim vim 文件名 # 打开或创建文件退出 vim 保存并退出: 按 Esc,然后输入 :wq,按 Enter。 不保存退出: 按 Esc&am…...
VoIP之SBC(会话边界控制器)
SBC(Session Border Controller,会话边界控制器)是一种在VoIP通信网络中的重要设备,用于连接处理会话边界,核心功能包含信令代理/媒体代理、网络NAT穿越、防火墙、QoS等。 经典案例 关键说明 用于客户端和核心业务服务器的互联互通支持IP接入控…...
threejs:document.createElement创建标签后css设置失效
vue3threejs,做一个给模型批量CSS2D标签的案例,在导入模型的js文件里,跟着课程写的代码如下: import * as THREE from three; // 引入gltf模型加载库GLTFLoader.js import { GLTFLoader } from three/addons/loaders/GLTFLoader.…...
安装2018版本的petalinux曲折经历
具体操作步骤 1.安装VMware Workstation15.5的虚拟机2.安装Ubuntu16.04.43.配置Ubuntu的环境1.可以复制粘贴的指令2.安装vim 4.准备安装petalinux1.先配置petalinux的安装环境2.替换镜像源1.备份原始的软件源2.从以下镜像点找到合适自己系统版本的源3.执行替换镜像源1.打开源文…...
return和print
目录 1.print的用法 2.return的用法 3. print 和 return 的区别 4.总结 1.print的用法 print 是一个函数,用于将信息输出到控制台(终端)。它主要用于显示程序运行的结果,方便用户查看。print 的作用是输出内容,而不…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
