C++中你不知道的namespace和using的用法

news/2024/10/28 18:31:28/

目录

引言

一: 冒号作用域

二、名字控制

1 命令空间

2 命令空间的使用

 三、 using的指令

1 using的声明

2 using的编译指令


引言

你是不是只认为namespace 和 using 在C++中是基本的语法框架,但是却不知道它们的真正用法,看完文章你会对using和namespace有一定了解,帮助你深入学习C++

一: 冒号作用域

:: 运算符是一个作用域,如果::前面什么都没有加 代表是全局作用域

也就是如果你输入的数前加了:: 代表是全局变量 

代码 

#include <iostream>
using namespace std;int a = 100;
void test01()
{int a = 10;cout << a << endl;    //打印局部变量cout << ::a << endl;  //打印全局变量
}
int main()
{test01();return 0;
}

 最后结果

10

100

二、名字控制

1 命令空间

namespace 本质是作用域,可以更好的控制标识符的作用域

命名空间 就可以存放 变量 函数 类 结构体 ...

2 命令空间的使用

1)命令空间的定义 必须定义在全局范围

2)命名空间下可以存放 变量 函数 结构体 类

namespace A
{int a = 1;void fun(){cout << "hello namespace" << endl;}void foo(int agr);struct std   //结构体{};class obj    //类{};}

3)命名空间可以重名 重名的命名空间相当于做合并操作

namespace B
{int a = 10;int b = 20;
}
//命名空间可以重名
namespace B
{int c = 100;
}

4)命名空间可以嵌套命名空间

//命名空间可以嵌套
namespace C
{int a = 10;int b = 20;namespace D{int a = 100;}
}
void test02()
{cout << C::a << endl;cout << C::D::a << endl;
}

5)命名空间可以取别名, namespace newname = oldname;新名字与旧名字有同等效益

namespace NewA = A;

6)命名空间可以没有名字 ,没有名字相当于给命名空间 内的所有成员加上了static修饰

相当于只能被当前文件调用,属于内部链接属性

namespace {int a = 10;void func() { cout << "hello namespace" << endl; }}

7)命名空间中的函数可以先声明,在外部定义,定义时需要加上命名空间作用域

namespace A
{void foo(int agr);	
}
void A::foo(int arg)
{cout << arg << endl;
}
void test03()
{A::foo(222);
}

总的代码

#include <iostream>
using namespace std;
// 命令空间的定义 必须定义在全局范围
// 命名空间下可以存放 变量 函数 结构体 类
// 命名空间可以重名 重名的命名空间相当于合并操作
// 命名空间可以嵌套命令空间
namespace A
{int a = 1;void fun(){cout << "hello namespace" << endl;}void foo(int agr);struct std   //结构体{};class obj    //类{};}
//与A作用域下定义不一样,这个在全局作用域下
void A::foo(int arg)
{cout << arg << endl;
}
namespace NewA = A;//命名空间是可以取别名// namespace newname = oldnamenamespace B
{int a = 10;int b = 20;
}
//命名空间可以重名
namespace B
{int c = 100;
}
//命名空间可以嵌套
namespace C
{int a = 10;int b = 20;namespace D{int a = 100;}
}
void test01()
{cout << A::a << endl;cout << B::a << endl;cout << B::b << endl;cout << B::c << endl;A::fun();        //表示A空间中fun函数调用}
void test02()
{cout << C::a << endl;cout << C::D::a << endl;
}
void test03()
{A::foo(222);
}namespace {int a = 10;void func() { cout << "hello namespace" << endl; }}int main()
{test01();test02();test03();return 0;
}

 三、 using的指令

1 using的声明

usinng 的声明可以使得指定标识符可用

注意: 当using声明的标识符和其他同名标识符有作用域的冲突时,会产生二义性

namespace nameA
{int a = 10;void foo(){cout << "Hello using" << endl;}
}
void test01()
{//注意当using指定声明标识符和其他标识符作用域有作用域的冲突时,会产生二义性//int a = 100using nameA::a;using nameA::foo;cout << nameA::a << endl;cout << a << endl;foo();
}

2 using的编译指令

void test02()
{int a = 1000;// using编译指令使整个命名空间标识符可用using namespace nameA;cout << a << endl; //结果为1000,就近原则foo();
}

总结代码

#include <iostream>
using namespace std;namespace nameA
{int a = 10;void foo(){cout << "Hello using" << endl;}
}
void test01()
{//注意当using指定声明标识符和其他标识符作用域有作用域的冲突时,会产生二义性//int a = 100using nameA::a;using nameA::foo;cout << nameA::a << endl;cout << a << endl;foo();
}
void test02()
{int a = 1000;// using编译指令使整个命名空间标识符可用using namespace nameA;cout << a << endl; //结果为1000,就近原则foo();
}
int main()
{test01();test02();
}

 输出


http://www.ppmy.cn/news/4836.html

相关文章

【Linux】shell 及权限理解

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;shell命令…

【Mysql】Sharding-JDBC实现读写分离、分库分表的原理分析

【Mysql】SpringBoot整合Sharding-JDBC实现读写分离、分库分表&#xff08;一&#xff09;介绍Sharding-JDBC&#xff08;1&#xff09;什么是Sharding-JDBC&#xff08;2&#xff09;Sharding-JDBC的源码是如何实现对JDBC增强的&#xff08;3&#xff09;Sharding-JDBC的分片原…

【C++进阶】C++11新特性下篇(万字详解)

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…

计算机毕设Python+Vue校园志愿者服务系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【愚公系列】2022年12月 .NET CORE工具案例-PLG轻量级日志可视化服务

文章目录前言1.Serilog简介2.Grafana简介3.Loki是什么一、Serilog对接Grafana轻量级日志可视化服务1.Grafana部署2.Loki部署3.promtail部署4.测试.NET Core写入日志效果5.测试查询日志总结前言 日志功能是几乎所有程序或系统都必备的一个功能。该文章通过使用LokiGrafana来实现…

Java内存模型

为什么要有java内存模型&#xff1f; 一&#xff1a;背景 1.现有计算机往往是多核的&#xff0c;每个外围下会有高速缓存。高速缓存的诞生是因为[CPU与内存(主存)的速度存在差别]&#xff08;因为CPU的频率太快了&#xff0c;快到主存跟不上&#xff0c;这样在处理器时钟周期内…

VMware、linux虚拟机设置网络实现虚拟机与主机网络互通

需要配置三个方面才可以&#xff0c;即&#xff1a;WMware网络配置、windows主机网络配置、虚拟机网络配置。 首先&#xff0c;确认VMware虚拟机设置中配置的网络连接方式为&#xff1a;NAT模式 可以在VMware上方的菜单中找到&#xff1a;虚拟机---->设置&#xff0c;然后…

【Linux】低级IO

目录 一、文件的概念 二、C语言文件操作回顾 三、使用系统调用进行文件I/O 1、系统调用open 1.1open接口介绍 1.2open形参中标记位flags的意义 1.3open的使用 2、系统调用write 2.1write接口介绍 2.2write的使用 3、系统调用read 3.1read接口介绍 3.2read的使用 …