命名空间 namespace

命名空间的意义:避免重名问题
为什么需要将函数定义在命名空间中呢?这其实是为了避免变量或函数重命名的问题。 试想,在一个多人同时开发的项目中,很有可能会出现全局变量或函数重名的现象,而如果每个人都定义了自己的命名空间,就可以解决这个问题,即使重名,只要分属不同的命名空间就不会引起问题。
例如:

#include "iostream"
#include"stdlib.h"
namespace MySpace
{
     int a (15);

     void  print()
     {
          std::cout << "我想静静"<<std::endl;
     }
}

namespace MySpaceA
{
     int a(25);
     void  print()
     {
          std::cout << "AAAAAAAAAA" << std::endl;
     }
}

void main()
{
     int a (5);
     std::cout << "MySpace a=" << MySpace::a << std::endl;
     std::cout << "MySpaceA a=" << MySpaceA::a << std::endl;
     std::cout << "  main a=" << a << std::endl;
     std::cout << "hello world" << std::endl;

     MySpace::print();
     MySpaceA::print();
     system("pause");
}

命名空间的别名
如果觉得命名空间名字太长或者太难记等等,可以给命名空间一个别名,调用时,可以使用别名。

namespace TT
{
     int a(10);
}
namespace t = TT;//给命名空间起一个别名

命名空间的嵌套
在命名空间下还可以嵌套命名空间。

namespace TT
{
     int a(10);
     namespace T   //命名空间的嵌套
     {
          int a(9);
     }
}

命名空间的拓展
命名空间可以拓展,但小心重名。

namespace TT
{

     int a(10);
}
namespace TT
{
     //int a(10);  // 重定义
     int y(10);
}

命名空间的作用域
using namespace 作用域从上往下,而且必须放在定义之后。

//using namespace MySpace;  // using必须在命名空间的定义后面,因此,此处错误
namespace MySpace
{
     int a(8);
}
using namespace MySpace;  // using必须在命名空间的定义后面

命名空间的特殊情况:没有命名的命名空间
没有命名的命名空间可以直接调用,这也可以看出命名空间中的数据是公开的,透明的。

//没有命名的命名空间可以直接调用
#include"iostream"

namespace
{
     int a(3);
     void print()
     {
          std::cout << "aaa";
     }
}

void main3()
{
     std::cout << a;
     print();
}

命名空间的特殊情况:数据是公开的
namespace 所有的数据,函数,类,对象都是共有的,而且不能私有化这些数据。

namespace MySpace
{
     int  y(5);
     int(*padd)(int, int);//函数指针接口
//private: 命名空间是透明的,不能有私有成员
     int  y1(5);
     class myclass
     {
     public://类默认是私有,实现封装
          int a;
     };
}

struct 结构体默认是透明的,数据是public的,而且可以私有化成员,而namespace不能私有化成员

struct MyStruct
{
     int b;//结构体默认是透明的
private:
     int a;//是私有
};

C中全局变量的缺点

C 出现重名无法引用全局变量。

#include<stdio.h>

int  a = 1;//C 出现重名无法引用全局变量
void main()
{
     int a = 3;
     printf("%d",a);
     getchar();
}

在C++ 中可以是使用 ::调用全局变量

#include<iostream>
#include<stdlib.h>
//int a = 1;
extern  int a; // C++要求严格,声明为全局变量
//int a = 10; 可以在别的文件中定义
void main()
{
     int a = 3;
     std::cout << ::a; // :: 调用全局的a

     system("pause");
}

在C++中使用头文件有两种方法
1、用C语言的传统方法
头文件名包括后缀.h,如stdio.h,math.h等。由于C语言没有命名空间,头文件并不存放在命名空间中,因此在C++程序文件中如果用到带后缀.h的头文件时,不必用命名空间,只需在文件中包含所用的头文件即可。
2、用C++的新方法
C++标准要求系统提供的头文件不包括后缀.h,例如iostream、string。为了表示与C 语言的头文件有联系又有区别,C++所用的头文件名是在C语言的相应的头文件名(但不包括后缀.h)之前加一字母c。例如,C语言中有关输入与输出的头文件名为stdio.h在C++中相应的头文件名为cstdio。注意在C++中,头文件cstnng和头文件strmg不是同一个文件。前者提供C语言中对字符串处理的有关函数(如strcmp,ctrcpy)的声明,后者提供C++中对字符串处理的新功能。
此外,由于这些函数都是在命名空间std中声明的,因此在程序中要对命名空间std作声明。
目前所用的大多数C++编译系统既保留了c的用法,又提供丁C++的新方法,但应当提倡使用C++的新方法。

==============================================

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

且漫CN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值