【C++初阶(一)】学习前言以及命名空间

news2024/11/19 11:30:01

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:C++初阶之路⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学习排序知识
  🔝🔝


在这里插入图片描述


命名空间

  • 1. 前言
  • 2. C++发展历史
  • 3. C++现状
  • 4. C语言命名冲突
  • 5. 命名空间
  • 6. 命名空间的使用
    • 6.1 方法一
    • 6.2 方法二
    • 6.3 方法三
  • 7. 对命名空间展开的思考
  • 8. 总结以及拓展

1. 前言

对于复杂的问题,规模较大的程序
需要高度的抽象和建模时
C语言不再适合应用于这种场景
于是在1982年
C++创始人
Bjarne Stroustrup
在C语言基础上引入面向对象编程概念

在这里插入图片描述

本节内容将在介绍完C++个方面的内容后
讲解C++入门第一课:命名空间的内容


2. C++发展历史

1979年,贝尔实验室的本贾尼等人试图分析unix内核的时候,试图将内核模块化,于是在C
语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为C with
classes。

阶段内容
C with classes类及派生类、公有和私有成员、类的构造和析构、友元、内联函数、赋值运算符
C++1.0添加虚函数概念,函数和运算符重载,引用、常量等
C++2.0更加完善支持面向对象,新增保护成员、多重继承、对象的初始化等等
C++3.0进一步完善引入模板,解决多重继承产生的二义性问题和相应构造和析构的处理
C++98C++标准第一个版本,以模板方式重写C++标准库,引入了STL(标准模板库)
C++03C++标准第二个版本,语言特性无大改变,主要:修订错误、减少多异性
C++05C++标准委员会发布了一份计数报告,正式更名C++0x
C++11增加了许多特性,使得C++更像一种新语言,比如:正则表达式、基于范围for循环、auto关键字、新容器、列表初始化、标准线程库等
C++14对C++11的扩展,主要是修复C++11中漏洞以及改进,比如:泛型的lambda表达式,auto的返回值类型推导,二进制字面常量等
C++17在C++11上做了一些小幅改进,增加了19个新特性,比如:static_assert()的文本信息可选,Fold表达式用于可变的模板,if和switch语句中的初始化器等
C++20自C++11以来最大的发行版,引入了许多新的特性,比如:模块(Modules)、协程(Coroutines)、范围(Ranges)、概念(Constraints)等重大特性,还有对已有特性的更新:比如Lambda支持模板、范围for支持初始化等
C++23正在制定中

3. C++现状

C/C++在TIOBE编程语言社区
常年位居前五

在23年更是霸榜前三!

在这里插入图片描述

关于C++23和最新的C++26
最前沿的改动文章给大家分享两篇

C++23前沿
C++26前沿


实际生活中
C++运用的地方非常多
比较典型的有:

  1. 操作系统以及大型系统软件开发
  2. 服务器端开发
  3. 游戏开发
  4. 嵌入式和物联网领域
  5. 数字图像处理
  6. 人工智能的算法核心领域

在校招笔试面试中
C++更是重量级的存在


4. C语言命名冲突

我们在写C语言时,会遇见这种问题:
取变量名时可能会和库中得变量名冲突

#include<stdio.h>
#include<stdlib.h>

int rand = 10;
int main()
{
	printf("%d", rand);
	return 0;
}

此时运行程序会报错:

在这里插入图片描述

这是因为在库中有了rand这个函数,再次使用rand这个名字定义变量或者函数时,编译器会分不清你到底想使用哪个rand


5. 命名空间

C++为了解决C语言上述的问题
引出了命名空间这种玩法

(C++兼容C语言的所有语法)

定义命名空间,需要使用到namespace关键字
后面跟命名空间的名字,然后接一对{}
{}中即为命名空间的成员

比如:

namespace NEO
{
	// 命名空间中可以定义变量/函数/结构体
	int rand = 10;
	
	int Add(int left, int right)//函数
	{
		return left + right;
	}
	
		struct Test//结构体
	{
		int a[10];
		int val;
	};
}

命名空间相当于一个独立的作用域
命名空间中所有内容都局限于该命名空间中

(注:命名空间可以嵌套定义)

在这里插入图片描述
拓展:
一个项目或者源文件可以有多个命名空间
它们的名字可以相同

相同名字的空间将会合并为一个空间


6. 命名空间的使用

6.1 方法一

方法一:不展开命名空间时

使用 :: 操作符

namespace NEO
{
	// 命名空间中可以定义变量/函数/结构体
	int rand = 10;
	int Add(int left, int right)
	{
		return left + right;
	}
		struct Node
	{
		struct Node* next;
		int val;
	};
}

int main()
{
	int a = NEO::rand;
	int x = NEO::Add(10,20);
	printf("%d", NEO::rand);
	return 0;
}

在命名空间NEO里面
你如果想使用一个变量或者函数
应该在这之前加上:

空间名 ::


6.2 方法二

方法二:展开命名空间

在空间NEO后面加上

using namespace NEO;

这句话的意思是:
将空间NEO展开为全局域

我们在看C++程序时经常看见:

using namespace std;

std就是C++的标准库

已知C++的输出函数是cout
cout是在标准库中定义的
假设标准库没有展开
我们使用cout时,编译器在全局域
没有找到cout就会报错.
这时就应该这样写:

std::cout << "hello world" << ;

当NEO空间被展开后
空间里的所有内容可以直接使用:

#include<stdio.h>

namespace NEO
{
	// 命名空间中可以定义变量/函数/结构体
	int rand = 10;
	int Add(int left, int right)
	{
		return left + right;
	}
		struct Node
	{
		struct Node* next;
		int val;
	};
}

using namespace NEO;

int main()
{
	int a = rand;
	printf("%d", rand);
	return 0;
}

6.3 方法三

方法三:展开空间中部分内容

假设NEO空间中的rand使用频率很高
可以将rand变量单独展开到全局域

using NEO::rand;

若Add函数使用频率很高:

using NEO::Add;

using NEO::rand;
int main()
{
	int a = rand;//rand展开了直接用
	int x = NEO::Add(10,20);//Add函数没有展开,要使用 ::
	printf("%d", rand);
	return 0;
}

7. 对命名空间展开的思考

假设我们将自定义NEO空间和
标准库的std空间同时展开
那么整型变量rand和rand函数
同时暴露在全局域
我们再去使用它时也会报错

using namespace std;
using namespace NEO;

所以直接展开std标准库也有冲突风险
但是不展开的话,写输入输出会很麻烦

那么平时写代码时应该怎么办?

结论:

  • 写项目时,尽量不要展开标准库
  • 日常练习时应该展开标准库
  • 写项目使用部分常用内容展开

8. 总结以及拓展

命名空间的存在奠基了C++
能作为创建一个大工程的语言
大工程往往会分组安排任务
每个小组可以使用不同的命名空间
每个空间定义相同的名字也没事
这对于开发者来说十分方便!

拓展:

分享几个用C++开发的知名游戏:

  • 绝地求生
  • 巫师三
  • 黑暗之魂
  • 无主之地2
  • 生化危机5

在这里插入图片描述


🔎 下期预告:缺省参数以及IO流 🔍

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

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

相关文章

Draw.io 如何编辑复杂的公式

Tips&#xff1a;Draw.io本身无法直接编辑复杂的公式或者数学表达式 需要转为Latex格式才能插入 >Latex在线编辑公式网址&#xff1a;https://www.latexlive.com 具体操作流程 1 进入https://www.latexlive.com 例如编辑如下公式&#xff1a; 2 开启Draw.io的数学排版 3…

postman中发送post请求保存数据到数据库中文乱码

postman&#xff1a; 以为是header中的问题&#xff1a;加上这俩问题并未解决&#xff1a; 以为是数据库的问题&#xff1a;改成这个也没解决 后台打印也没问题&#xff1a; book:::Book{idnull, type类别111, name测试名称, description测试描述数据} 最后的解决方法&…

如何对pdf文件大小进行压缩?怎么压缩pdf文件kb?

PDF资料因为嵌入了太多的图文信息&#xff0c;那么怎么才能压缩pdf文件呢&#xff1f;本篇就来教大家如何轻松完成pdf在线压缩&#xff0c;小伙伴们学会之后&#xff0c;就不用担心因为pdf过大不方便使用了&#xff0c;一起来了解一下pdf压缩&#xff08;https://www.yasuotu.c…

VisualStudio离线包制作

因为需要&#xff0c;需要制作VisualStudio离线包&#xff0c;之前尝试了很多的方案&#xff0c;均没有下载成功。今天偶然看到一个可行的方案&#xff0c;这里在这里分享下。 从微软官网下载VisualStudio离线包 1 下载安装文件 visualstudio官网 首先进入到官网中&#xff0…

WORDPRESS REST API 学习,使用VSCode 的 REST client 插件测试

WORDPRESS 的 REST API 本身是没有身份验证的&#xff0c;我安装了 miniOrange 的 WordPress REST API Authentication 免费部分只有 Basic Authentication 和 JWT Authentication &#xff0c; 作为学习 REST API 够用了。 一般使用 postman 测试 api &#xff0c;后来卸载了…

微软Surface Book 2终止更新日前推迟,将与Surface Pro 6同日结束服务

近日有消息称&#xff0c;微软公布了旗下Surface系列设备的更新支持终止日期&#xff0c;并且包括新发布的设备和前代产品。 早在本月23日&#xff0c;微软就为Surface Book 2推送了新的固件&#xff0c;主要提升了Surface Dock 2的稳定性&#xff0c;及其他一些安全更新。  …

需要买apple pencil吗?苹果平板触控笔推荐

随着科技的进步&#xff0c;各种类型的电容笔相继问世。一支好的电容笔&#xff0c;不仅能大大提高我们的工作效率&#xff0c;而且能大大提高我们的学习效率。平替电容笔&#xff0c;无论从技术上&#xff0c;还是从产品品质上来看&#xff0c;都有很大的发展空间&#xff0c;…

黑盒测试中常见的错误修复方法

引言&#xff1a; 黑盒测试是软件测试过程中常用的一种方法&#xff0c;它着重于测试软件的功能而不考虑内部实现细节。然而&#xff0c;在进行黑盒测试时&#xff0c;可能会发现各种类型的错误&#xff0c;如功能缺陷、界面问题和性能瓶颈等。为了确保软件质量和稳定性&#x…

【Visual Studio Code】C++程序的头文件红色波浪线问题

这是由于配置中没有指定依赖路径导致的&#xff0c;在c_cpp_properties.json中includePath的默认配置只有当前目录&#xff0c;需要将系统依赖加入。 在命令行里面输入 gcc -v -E -x c -在结果里面找到头文件目录,然后添加到includepath中。 运行结果如下: C:\Users\wangzp…

解决git clone 卡在Resolving deltas: 100%

操作系统&#xff1a;CentOS7 现象 git clone 一直卡在100%&#xff0c;如下图&#xff1a; 通过strace命令发现有网络超时的情况&#xff1a; 解决办法 将hostname添加到/etc/hosts解析至本地。 服务器hostname为k8s-master 在/etc/hosts文件中增加一条记录

6.24

1> 整理grep、find、cut、tar、apt-get、dpkg、In、In-s指令 a> grep ----->查找字符串 grep 字符串 文件名 -w:按单词查找 -R:实现递归查找&#xff0c;主要用于路径是目录的情况 -i:不区分大小写 -n:显示行号 例&#xff1a; grep -w "^ubuntu" /etc/pa…

3个谷歌seo批量发低质量外链的严重后果

谷歌对于低质量外链的态度一直非常谨慎&#xff0c;并采取了多项措施来遏制这种行为。 如果一个网站被发现在大量网页上使用低质量的外链&#xff0c;可能会面临以下后果&#xff1a; 排名下降&#xff1a;谷歌的算法越来越擅长识别低质量的外链&#xff0c;并对这些外链进行评…

单调栈和单调队列及其相关应用

前言&#xff1a;好久没更新了&#xff0c;痛苦的期末考试周终于过去了&#xff0c;我可以回来继续更新了&#xff0c;今天我们就来学习单调栈和单调队列的相关知识及其应用&#xff0c;单调栈和单调队列是在算法中常用的两种数据结构&#xff0c;用于解决一些与区间最值相关的…

Linux5.9 MySQLMHA高可用配置及故障切换

文章目录 计算机系统5G云计算第四章 LINUX MySQL MHA高可用配置及故障切换一、概述及原理1.什么是 MHA2.MHA 的组成&#xff08;工作原理&#xff09;3.MHA 的特点 二、MMM&#xff08;Master-Master replication manager for MvSQL&#xff0c;MySQL主主复制管理器&#xff09…

Promise 深度学习

文章目录 Promise 由来Promise的用法reject的用法finally all的用法race的用法总结 Promise 由来 我们处理异步函数最普通的方法是这样的&#xff0c;等待上一次请求结束再执行下一步操作&#xff1a; // 一般以定时器来模拟一次请求 setTimeout(() > {console.log("…

爬虫如何通过HTML和CSS采集数据的 ?

爬虫可以应用于各种应用场景&#xff0c;包括数据分析、市场研究、舆情监测、竞争报、价格比较、内容聚合等。对于需要大量数据的业务和研究领域&#xff0c;爬虫能够提供宝贵的支持。 爬虫可以按照设定的规则从多个网进行批量数据抓取&#xff0c;比人工手动方式更高效。量数据…

什么是DevOps

什么是DevOps 1.概述附录 1.概述 >什么是DevOps与CICD 附录 1.什么是DevOps

【Leetcode】19.删除链表的倒数第 N 个结点

一、题目 1、题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例1: 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]示例2: 输入:head = [1], n = 1 输出:[]示例3: 输入:head = [1,2], n = 1 输出:[1]提示: 链表中结点的数目为 sz…

通付盾升级数信云4.0,利用人工智能、区块链及Web3安全技术助力数据要素市场化

数据作为新型生产要素已成为数字时代的核心生产力。人工智能、区块链、云计算等新兴技术提升了数据要素的使用效率&#xff0c;开启数字化浪潮。但同时&#xff0c;以“数据上云”为代表的数据应用趋势也带来了数据安全、数据隐私和数据共享难等一系列阻碍数据要素化的问题。20…

excel相关操作

文章目录 1、数据分列与绘图1.1、杂乱的数据拷贝到excel1.2、 智能分列1.2 或者手动设置分列1.3、杂论的符号替换掉1.4、对时间再次只能分裂1.5、绘图 1、数据分列与绘图 1.1、杂乱的数据拷贝到excel 1.2、 智能分列 选择数据&#xff0c;数据–>分列–> 智能分列 结…