当前位置: 首页 > news >正文

命名空间(namespace)详解(一)

在学习命名空间之前,我们首先要了解几种常见的域

一、域的种类

1、类作用域

类作用域是指定义在类内部的成员(包括数据成员和成员函数)的可见性和访问权限的范围

代码示例:

#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>// 定义一个名为MyClass的类
class MyClass 
{
public:// 类内的成员变量int memberVar;// 类内的成员函数void memberFunction(){// 在成员函数内部可以直接访问类的成员变量memberVar = 10;std::cout << "在成员函数中,成员变量的值为:" << memberVar << std::endl;}
};int main()
{// 创建MyClass类的对象MyClass obj;// 通过对象访问类的成员变量obj.memberVar = 5;std::cout << "在main函数中,通过对象设置成员变量的值为:" << obj.memberVar << std::endl;// 通过对象调用类的成员函数obj.memberFunction();return 0;
}

2、命名空间域

命名作用域是一个区域,在这个区域内,一个特定的名字(比如变量名、函数名、类名等)是有意义的,并且可以被正确地引用。简单来说,它定义了一个范围,在这个范围里,名字具有明确的、独一无二的身份。

代码示例:

#include <iostream>
using namespace std;namespace myspace
{int a = 10;int Add(int x, int y){return x + y;}
}int main()
{cout << myspace::a << endl;cout << "hello world!" << endl;return 0;
}

3、局部域

局部变量的作用域通常被限定在定义它们的函数或代码块内,局部变量的生命周期通常与函数的执行周期相对应。 当函数被调用时,局部变量被创建;当函数执行完毕时,局部变量被销毁。

代码示例:

#include <stdio.h>int a = 10;int main()
{{int b = 0;printf("b的值为:%d\n", b);}//b是局部变量,作用域为所在的局部区域//printf("%d", b);//a为全局变量,作用域是全局的,可以在程序中的任意地方使用printf("a的值为:%d\n", a);
}

4、全局域

全局变量存放在静态存储区中。 因此他们的生存周期是固定的,存在于程序的整个运行过程中。

代码示例: 

#include <stdio.h>int a = 10;int main()
{{int b = 0;printf("b的值为:%d\n", b);}//b是局部变量,作用域为所在的局部区域//printf("%d", b);//a为全局变量,作用域是全局的,可以在程序中的任意地方使用printf("a的值为:%d\n", a);
}

二、访问顺序

在代码中访问顺序为

优先局部域 >> 其次访问全局域 >> 访问展开命名作用域或指定访问命名空间域

1、访问局部域

#include <stdio.h>
#include <stdlib.h>int a = 10;int main()
{int a = 0;printf("%d\n", a);
}

运行这段代码发现,只会打印局部变量a的值

2、访问全局域

那么如何才能访问全局变量的值呢?在C++中有以下办法

#include <stdio.h>
#include <stdlib.h>int a = 10;int main()
{int a = 0;printf("全局变量a的值为:%d\n", a);printf("全局变量a的值为:%d\n", ::a);
}

在这段代码中我们运用了符号 : : (域作用限定符)

空格 + : : 就可以顺利访问全局变量a的值 

3、访问命名空间域

接下来再看一段代码 

#include <stdio.h>
#include <stdlib.h>int atof = 1;int main()
{printf("%d\n", atof);
}

在这段代码中,假设在不知情的情况下定义了一个名为atof的变量,在main函数中打印这个变量的值,但是我们会发现代码会报错

 

经查可知,头文件stdlib.h中包含了名为atof的函数,此时我们再定义atof的变量就会报错,那么如何解决这个问题呢?就有了命名空间的用法

#include <stdio.h>
#include <stdlib.h>namespace myspace
{int atof = 1;
}int main()
{printf("atof的值为%d\n", myspace::atof);
}

此时我们创建了一个名为myspace的命名空间,通过访问myspace就可以成功获得atof的值

访问命名空间的方法
  • 展开命名空间域

假设需要访问std (标准库)

using namespace std

注意:展开相当于把命名空间的内容暴露在全局中,有风险,不建议使用

  • 指定访问命名空间 

假设访问命名空间myspace中的变量a

printf("a的值为:%d\n",myspace::a);
http://www.lryc.cn/news/485157.html

相关文章:

  • HarmonyOS ArkTs 解决流式传输编码问题
  • NPOI 实现Excel模板导出
  • 【OpenGL】OpenGL简介
  • shell命令笔记
  • qml显示OpenCV mat图片
  • 类与对象(2)---类的6个默认成员函数
  • 华为云租户网络-用的是隧道技术
  • 手搓神经网络(MLP)解决MNIST手写数字识别问题 | 数学推导+代码实现 | 仅用numpy,tensor和torch基本计算 | 含正反向传播数学推导
  • esp32c3安装micropython环境
  • ES6的Iterator 和 for...of 循环
  • 《C语言程序设计现代方法》note-4 基本类型 强制类型转换 类型定义
  • MySQL(4)【数据类型 —— 数值类型】
  • Golang超详细入门教程
  • 鸿蒙NEXT自定义组件:太极Loading
  • FPGA 第7讲 简单组合逻辑译码器
  • opencv kdtree pcl kdtree 效率对比
  • 1+X应急响应(网络)系统备份:
  • python os.path.dirname(path) 详解
  • 深度解析 Feign
  • AI工业大模型报告:体系架构、关键技术与典型应用
  • 深入理解接口测试:实用指南与最佳实践5.0(五)
  • 常用List工具类(取交集、并集等等)
  • 4 C++ 复合类型:引用和指针
  • ABAP关于PS模块CJ20N中项目物料的屏幕和字段增强CI_RSADD
  • 探索IDE的无限可能:使用技巧与插件推荐
  • 自动化生成测试用例:利用OpenAI提升电商网站测试覆盖率
  • 时间序列关于可解释性值得关注的论文汇总-第2篇
  • Vulnhub:DC-4靶机渗透——土豆片的靶机渗透练习
  • 【云原生系列--Longhorn的部署】
  • Java集合(Collection+Map)