服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 详情介绍C++之命名空间

详情介绍C++之命名空间

2021-12-29 14:06非常规自我实现 C/C++

这篇文章主要详情介绍了C++命名空间,命名空间的出现就是为了解决名称冲突问题,对此感兴趣的朋友可以参考下面文章

C++命名空间

1.概述

在c++中,名称(name)可以是符号常量、变量、函数、结构、枚举、类和对象等等。工程越大,名称互相冲突性的可能性越大。另外使用多个厂商的类库时,也可能导致名称冲突。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入关键字namespace(命名空间/名字空间/名称空间),可以更好地控制标识符的作用域。

因此:命名空间的出现就是为了解决名称冲突问题

2.格式

?
1
2
3
4
5
6
7
namespace 空间名称
{
    变量名称
    .....
    函数声明
    .....
}

3.定义范围

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
 
namespace test#这是正确的命名形式
{
    ..... 
}
 
int main()
{
namespace test01 #这是错误的命名形式
{
    
}
    ....
}

结论:命名空间只能在全局范围内定义

4.瀑布式开发格式

命名空间名称相同就是同一个命名空间

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
namespace test
{
 ....   
}
namespace test #名称相同就是同一个命名空间
{
    .......
}
 
int main()
{
    ........
}

5.命名空间的访问方式

5.1空间名::变量名

?
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
namespace test
{
    int a = 10;
}
int main()
{
    cout << test::a<<endl;
    
    .....
}   

5.2using namespace 空间名

?
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
namespace test
{
    int a = 10;
}
using namespace test;#需要在命名空间定义之后
int main()
{
    cout <<a<<endl;
    
    .....
}   

需要注意的是:

在使用该语法时,需要在命名空间定义之后,否则会提示找不到。

6.命名空间可以无限嵌套

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
namespace test01
{
    namespace test02
    {
        namespace test
        {
            int a = 10;
        }
    }
 
}
 
using namespace test01::test02::test;#如果采用第二种方式的话就需要这样声明
int main()
{
    cout << a << endl;
 
}

7.权限

命名空间不存在私有的概念,都是共有的。

这个也很好理解,因为命名空间的出现就是为了解决名称冲突的问题。仅仅只是解决这个问题而已。

8.匿名命名空间

原则上禁止使用匿名命名空间,出现匿名命名空间这总机制就是为了解决名称冲突

在了解上面的基础之上,我们再来讲述下面的语法规则

匿名命名空间中定义的变量等同于全局变量,但是再背显式调用的时候,使用原生全局变量

相信大家看到这句话会觉得很绝望,但是呢,编程就是这样,直接看代码就对了。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
int a = 10;
namespace #这就是匿名命名空间
{
  int a = 20;
}
int main()
{
    cout << a <<endl;
    .....
}

大家猜一下,上面的结果是什么?是10 还是 20

结果是编译不通过!!!提示是:变量a是不明确的符号

正如上面所说,匿名空间中定义的变量等同于全局变量,那不就相当于定义了两个相同名称的全局变量。那不就重定义了吗

Attention:C++中不存在变量的定义和声明

如果要想引用全局变量,那就是如下所示

?
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
int a = 10;
namespace #这就是匿名命名空间
{
  int a = 20;
}
int main()
{
    cout << ::a <<endl;
    .....
}

大家猜一下,上面的结果是什么?是10还是20

结果是10!!!

正如上面所说,如果变量a被调用,则被调用的是原生全局变量,那就是10。

我们说了,匿名命名空间中定义的变量就相当于全局变量,意味着如果没有定义原生全局变量,那么就可以像调用原生全局变量一样调用匿名空间中的全局变量。

?
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
namespace #这就是匿名命名空间
{
  int a = 20;
}
int main()
{
    cout << a <<endl;  #调用原生全局变量的方式
    .....
}

9.别名

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
int a = 10;
namespace test
{
  int a = 20;
}
namespace alise_test = test;#这就是给命名空间
 
int main()
{
    cout << ::a <<endl;
    .....
}

原则上是不推荐给标准命名空间起别名

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
int a = 10;
namespace test
{
  int a = 20;
}
namespace alise_std = std;#这是不建议的一种做法
 
int main()
{
    cout << ::a <<endl;
    .....
}

10.编程模型

使用命名空间的时候,最好还是遵循某种格式。不遵循这种方式也是可以的,对于我而言,准许某种框架的目的在于简便自己编码。

?
1
2
3
4
5
6
7
8
9
namespace test
{
    int a = 0;#变量名的定义
    int add(int a , int b );
}
int test::add(int a , int b )
{
    return a+b;
}

PS:命名空间中存放的是变量初始化、函数的声明、类的声明等等,而函数的定义

11.using语法使用

using namespace 空间名;

这个语句可以在程序中的任何一个地方使用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
namespace test
{
  int a = 20;
}
using namespace test; #test命名空间中的符号的作用域在该语句之后,该源文件之前
void hello(void)
{
    using namespace test;#test命名空间中的符号的作用域在该语句之后,函数体之前
    
}
int main()
{
    cout << a <<endl;
    .....
}

Attention:如果没有引用,命名空间里的代码块就不会被编译

如果命名空间中有大量的符号,采用上面一种方法就不太妥当,因为实际使用到的符号也就那么几个。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
namespace test
{
  int a = 20;
}
using namespace test::a; #只使用test命名空间中的a变量
int main()
{
    cout << a <<endl;
    .....
}

到此这篇关于详情介绍C++之命名空间的文章就介绍到这了,更多相关C++命名空间内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_46359697/article/details/120071452

延伸 · 阅读

精彩推荐
  • C/C++详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用

    strcpy 和strcnpy函数是字符串复制函数。接下来通过本文给大家介绍c语言中的strcpy和strncpy字符串函数使用,感兴趣的朋友跟随小编要求看看吧...

    spring-go5642021-07-02
  • C/C++c++ 单线程实现同时监听多个端口

    c++ 单线程实现同时监听多个端口

    这篇文章主要介绍了c++ 单线程实现同时监听多个端口的方法,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下...

    源之缘11542021-10-27
  • C/C++C语言中炫酷的文件操作实例详解

    C语言中炫酷的文件操作实例详解

    内存中的数据都是暂时的,当程序结束时,它们都将丢失,为了永久性的保存大量的数据,C语言提供了对文件的操作,这篇文章主要给大家介绍了关于C语言中文件...

    针眼_6702022-01-24
  • C/C++C++之重载 重定义与重写用法详解

    C++之重载 重定义与重写用法详解

    这篇文章主要介绍了C++之重载 重定义与重写用法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    青山的青6062022-01-04
  • C/C++C/C++经典实例之模拟计算器示例代码

    C/C++经典实例之模拟计算器示例代码

    最近在看到的一个需求,本以为比较简单,但花了不少时间,所以下面这篇文章主要给大家介绍了关于C/C++经典实例之模拟计算器的相关资料,文中通过示...

    jia150610152021-06-07
  • C/C++深入理解goto语句的替代实现方式分析

    深入理解goto语句的替代实现方式分析

    本篇文章是对goto语句的替代实现方式进行了详细的分析介绍,需要的朋友参考下...

    C语言教程网7342020-12-03
  • C/C++C语言实现电脑关机程序

    C语言实现电脑关机程序

    这篇文章主要为大家详细介绍了C语言实现电脑关机程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    xiaocaidayong8482021-08-20
  • C/C++学习C++编程的必备软件

    学习C++编程的必备软件

    本文给大家分享的是作者在学习使用C++进行编程的时候所用到的一些常用的软件,这里推荐给大家...

    谢恩铭10102021-05-08