前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++初阶】命名空间 namespace

【C++初阶】命名空间 namespace

作者头像
aosei
发布2024-01-23 14:17:34
1610
发布2024-01-23 14:17:34
举报
文章被收录于专栏:csdn-nagiY

一.前言

在正式进入C++前,我们需要先了解了解C++。顾名思义,C++是基于C的一种编程语言,相较于C,C++写出来的代码更简洁,有时候C需要几百行代码,而C只需要几十行就可以解决,C++也很好的解决了C中存在的一些问题,例如:命名冲突。 C++的命名空间就能很好的解决这个问题。

二.命名冲突

在C语言中,我们定义的变量不能是库里有的,例如 int  printf  就不能这么定义,因为printf是库的函数,这样定义变量就会命名冲突。

上图就很好的展示了这个错误。那库那么多,我们怎么保证当我们新加了一个头文件时,不会形成命名冲突呢?万一这个命名冲突又很多该怎么办?要全部改掉吗? 完全不需要,C++的命名空间可以完美解决这个问题。

三.命名空间  namespace

A.命名空间的定义

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

例:

代码语言:javascript
复制
namespace  Eve   //命名空间的名字
{
    //命名空间的成员
    int a=10;
    int b=20;
    char d='a';
}     //注意这里没有分号

命名空间的成员可以是变量,函数,类型等; 命名空间可以嵌套定义; 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中; ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个。

B.命名空间的使用

1.使用命名空间的目的

使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。

2.域

域分为: 1.类域; 2.命名空间域; 3.全局域; 4.局部域; 它们的访问顺序一般是:局部域->全局域->展开的命名空间域  or  指定访问的命名空间域

3.命名空间的三种使用方式
a.加命名空间名称及作用域限定符  (::)

作用域限定符:“::”(即两个冒号);

使用格式:命名空间的名字::成员名

注:若::前是空白,则访问的是全局的成员。

例:

代码语言:javascript
复制
namespace Eve
{
    int a=10;
    char b='a';
}

int main()
{
    printf("%d  %c\n",Eve::a,Eve::b);   //访问命名空间内的成员
    
    return 0;
}
b.使用using将命名空间中某个成员引入

using可以理解为展开,展开后的命名空间或是命名空间中的成员将暴露在全局域下。

例:

代码语言:javascript
复制
namespace Eve
{
    int a=10;
    int b=20;
}

using  Eve::a;  //展开命名空间中的成员a,注意后面有分号

int main()
{
    printf("%d\n",a);  //因为a已经展开了,所以可以直接使用

    return 0;
}
c.使用using namespace 命名空间名称 引入

例:

代码语言:javascript
复制
namespace Eve
{
    int a=10;
    int b=20;
}

using  namespace Eve;  //展开整个命名空间,注意后面有分号

int main()
{
    printf("%d\n",a);  //因为a已经展开了,所以可以直接使用

    return 0;
}

访问嵌套的命名空间的成员时:

C.例子总结

代码语言:javascript
复制
int a = 0;

namespace Eve
{
	int a = 1;
	
}

//using namespace Eve;

int main()
{
	int a = 2;

	printf("%d\n", a);
	printf("%d\n", ::a);
	printf("%d\n", Eve::a);

	return 0;
}

打印结果是什么呢?

如图所示:第一个printf 访问的是局部变量                   第二个printf 访问的是全局变量;                   第三个printf 访问的是命名空间Eve里的a。


三.一些小技巧

using  namespace  std; 上面这句代码是展开标准库(展开前要包含头文件<iostream>),但不能随意展开,有一定的风险,平常练习可以用用,做项目时建议不要展开。 还有一些我们常用的可以展开,比如cout,cin,endl等,这样更便捷。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.前言
  • 二.命名冲突
  • 三.命名空间  namespace
    • A.命名空间的定义
      • B.命名空间的使用
        • 1.使用命名空间的目的
        • 2.域
        • 3.命名空间的三种使用方式
        • a.加命名空间名称及作用域限定符  (::)
        • b.使用using将命名空间中某个成员引入
        • c.使用using namespace 命名空间名称 引入
      • C.例子总结
      • 三.一些小技巧
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档