【C++杂货铺】快速学会命名空间

2024-01-23 18:44

本文主要是介绍【C++杂货铺】快速学会命名空间,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

🌈前言

📁 命名空间的定义

📁 命名空间的使用

● 加命名空间名称及作用域限定符

● 使用using将命名空间中某个成员引入

● 使用using namespace 命名空间名称 引入

📁 C++输入 和 输出

📁 总结


🌈前言

        欢迎收看本期【C++杂货铺】,这期内容,我们将围绕C++中内存空间进行讲解。如果你想学习C++,或者刚学完C语言衔接C++,那么这篇文章将会非常有效的帮助你理解。

        在C语言学习过程中,我们知道同一个作用域下是不能创建同名的变量/函数/结构体的,问题就来了,随着我们不断学起,代码越写越多,让我们起这么多名也不行呀。这时,C++ 的开发者本贾尼·斯特劳斯特卢普就想到了一种方法,就是命名空间,不同命名空间的对象是可以同名的。

📁 命名空间的定义

        在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的

拓:

        C++中域分为 全局域,局部域,命名空间域,类域。目前,如果你还没学习过C++,你只需先了解前三个域即可,类域会在后面的【C++杂货铺讲解】。

        编译器想要搜索一个变量/函数时,规则如下:

        1. 首先查找局部域

        2. 在查找去全局域

        3. 如果上述操作后,依然没有找到没报错,如果你指定了命名空间,那么编译器会跳过上述步骤,直接进入命名空间进行查找。

        如何指定一个命名空间呢,就要用到操作符 :: ,即域作用限定符

        下面,我们来举一个例子,C语言环境下有一个rand函数,是用来生成伪随机数的一个函数,包含在<stdlib.h>这个头文件中,如果我们想用在创建一个变量rand,会发现,编译器会报错。

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
{printf("%d\n", rand);
return 0;
}
// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”

        倘若你使用C++来编写代码,你就可以创建个命名空间将rand变量放入进去。

#include <iostream>
namespace test
{int rand;
}
int main()
{test::rand = 0;return 0;
}

        以上就是命名空间的应用场景,即避免了同名变量/函数的冲突问题。下面我们来看看命名空间如何创建使用。

📁 命名空间的使用

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

//1. 命名空间中可以定义变量/函数/类型
namespace N1
{int a;int add(int x,int y){return x + y;}struct Node{struct Node* next;int val;}
}//2. 命名空间可以嵌套
namespace N1
{int a;int b;int Add(int x, int y){return left + right;}namespace N2{int c;int d;int Sub(int x, int y){return x - y;}}
}//3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
// test.h
namespace N1
{int Mul(int x, int y){return x * y;}
}

        以上我们就学会了如何创建命名空间,那么如何去使用呢。倘若不加任何东西,是不能直接使用的,正如们上面拓展所讲,编译器会在局部和全局域中搜索,没有指定命名空间会报错。

#include <iostream>namespace N
{int a = 10;int b = 20;
}int main()
{// 编译报错:error C2065: “a”: 未声明的标识符printf("%d\n", a);
return 0;
}

● 加命名空间名称及作用域限定符

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

● 使用using将命名空间中某个成员引入

using N::b;
int main()
{printf("%d\n", N::a);printf("%d\n", b);return 0;    
}

● 使用using namespace 命名空间名称 引入

using namespce N;
int main()
{printf("%d\n", N::a);printf("%d\n", b);Add(10, 20);return 0;    
}

📁 C++输入 和 输出

        以上,我们就对命名空间有了了解,这也方便你更好的理解下面的内容。我们首先来看看C++中如何输出"Hello World ",当然你也可以是使用纯C写printf函数,也可以使用cout。

#include <iostream>using namespace std;
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中int main()
{cout<<"Hello World" <<endl;
}//using std::cout//std::cout<<"Hello World" <<endl;

拓:

1. 使用 cout 标准输出对象 ( 控制台 ) cin 标准输入对象 ( 键盘 ) 时,必须 包含 < iostream > 头文件以及按命名空间使用方法使用std
2. cout cin 是全局的流对象, endl 是特殊的 C++ 符号,表示换行输出,他们都包含在包含 <
iostream > 头文件中。
3. << 是流插入运算符, >> 是流提取运算符
4. 使用 C++ 输入输出更方便,不需要像 printf/scanf 输入输出时那样,需要手动控制格式。
C++ 的输入输出可以自动识别变量类型。

        也就是说cin 和 cout 都是在std这个命名空间里的。如果不是用usingnamespace std的话,可以using每个成员变量,或者+上域作用限定符 :: 。最后的endl就是输出换行的意思,类似与'\n'的功能。

📁 总结

        总结一下,我们这期内容讲了什么是命名空间,它的作用就是避免命名冲突,如何去定义命名空间,如要注意的是同一个命名空间是不能有同名的变量/函数/结构体对象的,此外,我们还对cin和cout进行了讲解。

stdC++标准库的命名空间,如何展开std使用更合理呢?
1. 在日常练习中,建议直接 using namespace std 即可,这样就很方便。
2. using namespace std 展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型 /
/ 函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模
大,就很容易出现。所以建议在项目开发中使用,像 std::cout 这样使用时指定命名空间 +
using std::cout 展开常用的库对象 / 类型等方式。
最后,如果感觉本期【C++杂货铺】—— 命名空间 (解决命名冲突等问题) 对你有帮助,欢迎点赞,收藏,关注Thanks♪(・ω・)ノ

这篇关于【C++杂货铺】快速学会命名空间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/637179

相关文章

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

变量与命名

引言         在前两个课时中,我们已经了解了 Python 程序的基本结构,学习了如何正确地使用缩进来组织代码,并且知道了注释的重要性。现在我们将进一步深入到 Python 编程的核心——变量与命名。变量是我们存储数据的主要方式,而合理的命名则有助于提高代码的可读性和可维护性。 变量的概念与使用         在 Python 中,变量是一种用来存储数据值的标识符。创建变量很简单,

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象