C++【命名空间详解】

news2025/1/12 15:58:32

系列文章目录

本篇文章呢主要说的是C++中关于命名空间相关知识点哦~


文章目录

  • 一、C++简单介绍
  • 二、详解
    • 1.命名空间
    • 2.输入输出
  • 总结

一、C++简单介绍

  前面我们学习的C语言,它是结构化和模块化的语言,适合处理较小规模的程序。那么,对于一些复杂的问题,规模比较大的程序,需要高度的抽象和建模时,对C语言而言就是块烫手山芋,不太合适的哦。那么,既然有了这个问题,必然会有降服它的办法。为了解决软件危机,在20世纪80年代的时候,计算机界提出了OOP思想(面向对象思想),支持面向对象的程序设计语言应运而生。

1982年,我们接下来会用到的这个语言,是Bjarne Stroustrup博士在C语言的基础上引入并且扩充了面向对象的概念,发明了一种新的语言,即C++;所以,C++是基于C语言而生的。它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。

二、详解

1.命名空间

命名空间的产生?

  在刚开始学校C++的时候,去看C++的代码,是不是往往会看到很多代码中有这条语句:

using namespace std;

那这句话是什么意思呢?它表明使用了C++官方库定义的命名空间。那一问究竟,什么是命名空间,又为什么需要这个命名空间呢?接下来我们一探到底……

(1)什么是命名空间?

它实质上其实就是一个由程序设计者命名的内存区域,为了防止名字冲突从而引入的一种机制。换句话说,就相当于一个灵活的文件域。

注:

(1)在域外使用域内成员时,需要加上命名空间名作为前缀,再加上域操作符“::”,这样的话就可以使用嵌套定义了。

(2)如果在关键字namespace的前面使用using,那么就没有必要使用限定修饰名,也就是说可以一次性使命名空间中的所有成员都可以直接被使用。

强调!!!

如果使用命名空间std的话,那么#include编译预处理命令包含头文件的时候,可最好就不要再把.h加到后面啦,去掉会更好一些~

#include<iostream.h>
using namespace std;
int main()
{
    count << "hello" << endl;
	getchar();
}

看好啦,这个就是在很老很老的编译器上才会有的哦!

在这里对命名空间再啰嗦几点说明:

(1)系统中可以定义多个命名空间,每个命名空间都是有它自己的名字的,是不可以同名的。

(2) 我们把命名空间不要想的有多神奇,我们就把它看成一个作用域,如果我们在这个命名空间里定义的函数与另外一个命名空间里的函数就算是同名也没啥影响的哦~

(3)命名空间它的定义呢是可以不连续的,甚至说可以写在多个文件中。

a:假如说之前没有定义这个命名空间的话,那么namespace 命名空间名 就相当于是重新定义了一个新的命名空间。

b:假如说在之前就已经定义了这个命名空间的话,那么namespace 命名空间名 就相当于是打开已经存在的命名空间并且为其添加新成员的声明。

(4)这里呢,命名空间是不影响内存布局的。

(2)命名空间的定义

前面已经提到了,格式为:namespace 命名空间名,然后再跟一对{ }即可,{ } ---->里面是命名空间的成员。

1.正常的命名空间定义

// 1. 正常的命名空间定义
namespace zry
{
	// 命名空间中可以定义变量/函数/类型
	int rand = 100;
	int Add(int left, int right)
	{
		return left + right;
	}
	struct Node
	{
		struct Node* next;
		int val;
	};
}

2.命名空间可以嵌套

//命名空间可以嵌套
namespace N1
{
	int a;
	int b;
	int Add(int left, int right)
	{
		return left + right;
	}
	namespace N2
	{
		int c;
		int d;
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}

3.同一个工程中允许存在多个相同名称的命名空间,编译器它在最后的时候会合成同一个命名空间。

//比如说这里test.h与test.cpp中的两个N1会合并成一个。

// test.h
namespace N1
{
	int Mul(int left, int right)
	{
		return left * right;
	}
}
//test.cpp
namespace N1
{
	int a;
	int b;
	int Add(int left, int right)
	{
		return left + right;
	}
	namespace N2
	{
		int c;
		int d;
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}

注意哦:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于这个命名空间中。 

 (3)命名空间的使用方式

在这里呢,我们介绍三种关于命名空间的使用方式:

a:指定它属于该命名空间 
namespace N
{
	int printf = 50;
	int strstr = 100;
}
int main()
{
	printf("%d\n",N::strstr);
	printf("%d\n",N::printf);
	system("pause");
	return 0;
}

就看上面这段代码,用namespace直接指定,然后搭配域作用限定符就🆗啦!(域作用限定符——> ::)

b:使用using namespace 命名空间名称引入
namespace N
{
	int printf = 50;
	int strstr = 100;
}
using namespace N;

int main()
{
	printf("%d\n", N::strstr);
	printf("%d\n", N::printf);
	system("pause");
	return 0;
}

 这段代码中,就是使用using namespace之后,相当于把N中的内容全部展开在全局作用域中,可是当年去运行这段代码的时候其实是跑不过的,因为这里面的内容有可能会和其他东西产生冲突,就比如说关键字和函数名之类的,所以,非特殊情况的话,一般不建议用这样的方式哦~

 那既然有它的出现,肯定会遇到需要用到它的情况吧~

看这段代码,此时,当你定义的是很简单的但是不会产生冲突的变量时,就是可以使用using namespace的了~

namespace N
{
	int m = 100;
}
using namespace N;

int main()
{
	printf("%d\n", m);
	printf("%d\n", N::m);
	system("pause");
	return 0;
}

c:使用using将指定的命名空间中成员引入
namespace N
{
	int m = 10;
	int zry = 20;
}
using N::m;

int main()
{
	printf("%d\n", m);
	printf("%d\n", N::zry);
	system("pause");
	return 0;
}

在这段代码中,有了using这个用法,就指定只展开m。


总结

以上就是本篇文章介绍的关于C++的简单介绍以及命名空间的内容。新手一枚,如有错误,欢迎各位友友评论区留言哦~~~

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

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

相关文章

汉得欧洲x甄知科技 | 携手共拓全球化布局,助力出海中企数智化发展

HAND Europe 荣幸获得华为云颁发的 GrowCloud 合作伙伴奖项&#xff0c;进一步巩固了其在企业数字化领域的重要地位。于 2023 年 10 月 5 日&#xff0c;HAND Europe 参加了华为云荷比卢峰会&#xff0c;并因其在全球拓展方面的杰出贡献而荣获 GrowCloud 合作伙伴奖项的认可。 …

华为eNSP配置专题-ACL的配置

文章目录 华为eNSP配置专题-ACL的配置1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、基本终端构成和连接2.2、各终端基本配置2.2.1、PC1和PC2的配置2.2.2、模拟互联网的路由器的配置2.2.3、财务部服务器的配置2.2.4、路由器AR1的配置 2.3、让各网段能够ping通互联…

Java系列 | 如何讲自己的JAR包上传至阿里云maven私有仓库【云效制品仓库】

什么是云效 云效是云原生时代一站式 BizDevOps 平台&#xff0c;产研数字化同行者&#xff0c;支持公共云、专有云和混合云多种部署形态&#xff0c;通过云原生新技术和研发新模式&#xff0c;助力创新创业和数字化转型企业快速实现产研数字化&#xff0c;打造“双敏”组织&…

云安全—NIST SP 500-292

0x00 前言 未经允许&#xff0c;禁止转载 背景 NIST云计算计划于2010年11月正式启动&#xff0c;旨在支持联邦政府在适当的情况下将云计算纳入传统信息系统和应用程序模型的替代或增强 主要目标 定义了包括三种基本服务模式&#xff0c;SaaS、PaaS、IaaS&#xff0c;四种部…

微信小程序开发之框架篇

目录 一&#xff0c;框架 1.页面管理 2.基础组件 3.丰富的API 二、小程序视图层 1.响应的数据绑定 2.列表渲染 3.条件渲染 4.模板 三、逻辑层 App Service 1.注册小程序 2.注册页面 2.1.使用 Page 构造器注册页面 2.2.在页面中使用 behaviors 3.页面路由 4.小…

PC电脑 VMware安装的linux CentOs7如何扩容磁盘?

一、VM中进行扩容设置 必须要关闭当前CentOS&#xff0c;不然扩展按钮是灰色的。 输入值必须大于当前磁盘容量。然后点击扩展&#xff0c;等待扩展完成会提示一个弹框&#xff0c;点击确定&#xff0c;继续确定。 二、操作CentOS扩容——磁盘分区 第一步设置完成。那就启动 …

多维时序 | MATLAB实现SSA-CNN-BiLSTM-Attention多变量时间序列预测(SE注意力机制)

多维时序 | MATLAB实现SSA-CNN-BiLSTM-Attention多变量时间序列预测&#xff08;SE注意力机制&#xff09; 目录 多维时序 | MATLAB实现SSA-CNN-BiLSTM-Attention多变量时间序列预测&#xff08;SE注意力机制&#xff09;预测效果基本描述模型描述程序设计参考资料 预测效果 基…

Spring事务和事务的传播机制(JavaEE进阶系列7)

目录 前言&#xff1a; 1.为什么需要事务 2.Spring中事务的实现 2.1编程式事务 2.2声明式事务 2.3Transactional的作用范围 2.4Transactional参数说明 2.5Transactional的注意事项 2.6Transactional工作原理 3.事务隔离级别 3.1事务特性的回顾 3.2Spring中设置事务…

Android Fragment 基本概念和基本使用

Android Fragment 基本概念和基本使用 一、基本概念 Fragment&#xff0c;简称碎片&#xff0c;是Android 3.0&#xff08;API 11&#xff09;提出的&#xff0c;为了兼容低版本&#xff0c;support-v4库中也开发了一套Fragment API&#xff0c;最低兼容Android 1.6。 过去s…

Linux中使用nfs共享存储

NFS是一种基于TCP/IP传输的网络文件系统协议。通过使用NFS协议&#xff0c;客户机可以像访问本地目录一样访问远程服务器中的共享资源。对于大多数负载均衡群来说&#xff0c;使用NFS协议来共享数据存储是比较常见的做法&#xff0c;NFS也是存储设备必然支持的一种协议。但是由…

VM虚拟机运行的Ubuntu连入同一局域网,并实现双机方法

环境&#xff1a; Windows 10 VMware Workstation Pro 16 Ubuntu 20.4 在虚拟机设置桥接模式 确保虚拟机处于关闭状态&#xff0c;在Vm中设置&#xff1a; 编辑->虚拟网络编辑器 如果你以前设置过&#xff0c;可以重置之。 重置之后&#xff0c;添加桥接模式&#xff1a; …

pytorch_神经网络构建4

文章目录 循环神经网络LSTM词嵌入skip-Gram模型N-Gram模型词性预测RNN循环神经网络的基础模块实现RNN识别图片RNN时间序列预测词向量模块词向量运用N-Gram模型lstm词性预测 循环神经网络 这个网络主要用来处理序列信息,之前处理图片时大部分是分析图片的结构信息, 什么是序列信…

Mac电脑Dock窗口预览工具 DockView

DockView是一款适用于Mac操作系统的软件&#xff0c;为用户提供了一种方便的窗口管理工具。这款软件可以让用户更高效地管理和浏览当前打开的窗口。 DockView的主要功能是在Dock栏上显示每个窗口的缩略图&#xff0c;并提供了一些相关的操作选项。当用户将鼠标悬停在Dock栏上的…

前端之【数据可视化】

目录 &#x1f31f;前言&#x1f31f;为什么要数据可视化(优点)&#x1f31f;前端数据可视化框架&#x1f31f;Echarts&#x1f31f;Highcharts&#x1f31f;D3 &#x1f31f;数据可视化框架的选择&#x1f31f;写在最后 &#x1f31f;前言 数据可视化主要旨在借助于图形化手段…

阿里云云服务器实例使用教学

目录 云服务器免费试用 详细步骤 Xshell 远程连接 云服务器免费试用 阿里云云服务器网址&#xff1a;阿里云免费试用 - 阿里云 详细步骤 访问阿里云免费试用。单击页面右上方的登录/注册按钮&#xff0c;并根据页面提示完成账号登录&#xff08;已有阿里云账号&#xff09;…

Qt/C++编写物联网组件/支持modbus/rtu/tcp/udp/websocket/mqtt/多线程采集

一、功能特点 支持多种协议&#xff0c;包括Modbus_Rtu_Com/Modbus_Rtu_Tcp/Modbus_Rtu_Udp/Modbus_Rtu_Web/Modbus_Tcp/Modbus_Udp/Modbus_Web等&#xff0c;其中web指websocket。支持多种采集通讯方式&#xff0c;包括串口和网络等&#xff0c;可自由拓展其他方式。自定义采…

视频目标语义分割自动标注——从图像轮廓提取到转成json标签文件

前言 语义分割数据标注是为训练语义分割模型准备数据的过程。语义分割是计算机视觉领域的任务&#xff0c;其中需要为图像中的每个像素分配一个类别标签&#xff0c;以区分不同的对象或区域。标注数据时&#xff0c;通常需要为每个对象或区域分配一个唯一的标签&#xff0c;并…

STM32 HAL库高级定时器输入捕获脉宽测量

STM32 HAL库高级定时器输入捕获脉宽测量 &#x1f4cc;相关篇《STM32 HAL库定时器输入捕获SlaveMode脉宽测量》 ✨相比于上面所使用的高级定时器输入捕获从模式来测量PWM信号&#xff0c;实现方法更为复杂一下&#xff0c;但是还是将实现的方法记录下来。 &#x1f4cc;本篇实现…

OpenCV16-图像连通域分析

OpenCV16-图像连通域分析 1.图像连通域分析2.connectedComponents3.connectedComponentsWithStatus 1.图像连通域分析 连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域。连通域分析是指在图像中寻找彼此互相独立的连通域并将其标记出来。 4邻域与8邻域的概念&am…

TatukGIS Developer Kernel使用教程:如何为FMX创建第一个应用程序

概述&#xff1a;TatukGIS Developer Kernel&#xff08;DK&#xff09;是一个用于开发自定义地理信息系统&#xff08;GIS&#xff09;应用程序以及解决方案的综合性软件开发工具包&#xff08;SDK&#xff09;。本篇文章主要介绍用DK11为FMX创建一个应用程序&#xff0c;现在…