首页 > 编程语言 >c++ namespace

c++ namespace

时间:2023-01-20 20:45:36浏览次数:58  
标签:嵌套 int namespace c++ 命名 名字 空间

名字空间:

名字空间有两个特征:1. 顺序 2.嵌套

顺序:编译器和解释器相当于一个翻译官,拿着本子一行一行读代码,只有见过的名字才会记到本子上,每见过的名字他就不认识(所以C++需要声明 ,python需要导入)。

嵌套:当翻译官进入一个新的名字空间时(花括号体),翻译官会在记这些名字时会用花括号体的名字加上标识。

当需要使用一个名字时,翻译官会从小本子的最后向前找,若找到就不继续找了,因此内部变量会对外部变量进行隐藏,例如下图F1内使用girl的名字时是使用自己声明的对象。

若在当前名字空间时找不到就向前去父亲空间找,同样以F1为例可以用girl这个名字访问父亲N2中声明的girl对象。

 

  • 顺序体现了时间性:只有记在本子上的名字才能使用。
  • 嵌套体现了结构性:
    • 处于同一个嵌套体系内部的空间可以不加空间名约束的使用父亲空间里的名字。
    • 处于不同嵌套体系的可以通过名字空间约束来访问其它名字空间中的名字。

 

 

 

 

 

 

 

全局性质名字空间内的名字会一直记载翻译官的本子上,可以在任何地方通过名字空间约束去访问(因此类名,命名空间名等不能相同,因为需要用它来表示名字)。

局部性质名字空间内的名字会在离开名字空间体(花括号体)时被划掉,无法在其他地方使用这些名字。

 

名字空间是c++特有的,在c的时候没有,目的是为了防止三方库的名字冲突。有如下特征

1.命名空间将全局作用域分成不同的部分,
2.不同命名空间中的标识符可以同名而不会发生冲突
3.命名空间可以发生嵌套
4.全局作用域也叫默认命名空间,使用::表示

C++命名空间的使用:

使用整个命名空间:using namespace name;
使用命名空间中的变量:using name::variable
使用默认命名空间中的变量:  ::variable

using namespace指令避免使用名称空间前置。该指令告诉编译器后续代码正在使用指定命名空间中的名称,一般的时候是默认不用的,因为会导致名字冲突

 

使用示例:

命名空间的定义

namespace A {
    int a = 100;
}
void test02()
{
    cout<<"A中a = "<<A::a<<endl;//100
}

命名空间只能在全局范围内进行定义,也就是函数外,类内不可定义,类内本身就是一个命名空间

命名空间可以嵌套

namespace A {
    int a = 1000;
    namespace B {
        int a = 2000;
    }
}
void test03()
{
    cout<<"A中的a = "<<A::a<<endl; //1000
    cout<<"B中的a = "<<A::B::a<<endl; //2000
}

命名空间是开放的,可以随时加入新的

namespace A {
    int a = 100;
    int b = 200;
}
//将c添加到已有的命名空间A中
namespace A {
    int c = 300;
}
void test04()
{
    cout<<"A中a = "<<A::a<<endl;//100
    cout<<"A中c = "<<A::c<<endl;//200
}

命名空间可以存放变量和函数

命名空间内的函数可以只进行声明,在命名空间外进行定义

无名的命名空间只能在本文件中使用,相当于加了static

namespace{
    int a = 10;
    void func(){
        cout<<"hello namespace"<<endl;
    }
}
void test(){
 
    //只能在当前源文件直接访问a 或 func
    cout<<"a = "<<a<<endl;
    func();
}

命名空间可以起别名

namespace veryLongName{
 
int a = 10;
void func(){ cout << "hello namespace" << endl; }
 
}
 
void test(){
    namespace shortName = veryLongName;
    cout << "veryLongName::a : " << shortName::a << endl;
    veryLongName::func();
    shortName::func();
}

 

参考:

(85条消息) 【C++】命名空间(namespace)详解_GeekBuilding的博客-CSDN博客_namespace

详解c++的命名空间namespace - 知乎 (zhihu.com)

标签:嵌套,int,namespace,c++,命名,名字,空间
From: https://www.cnblogs.com/uestc-du/p/17063216.html

相关文章

  • C#调用C++动态链接库dll之P/Invoke方式 — 1.无参无返回值函数调用
    1.新建一个C++空项目CPPTest2.新建一个PInvokeTest.cpp文件,并写下如下代码需要注意:下文中的两个函数名HelloWorld需要完全一致,只有这样才能确保被完全声明为一个其......
  • C++ Templates 中文版 电子书 pdf
    本书是C++模板编程的完全指南,旨在通过基本概念、常用技巧和应用实例3方面的有用资料,为读者打下C++模板知识的坚实基础。关注公众号:后厂村搬砖工。发送:电子书即可。......
  • C++ 基础语法2
    #include<iostream>usingnamespacestd;#include<string>#include<time.h>//结构体定义//structStudent//{//stringname;//intage;//intcount;//};//在结构体尾......
  • C++基础语法 3(面向对象、C++在执行过程当中4个区域、引用)
    #include<iostream>usingnamespacestd;//标注空间#include<string>#include<time.h>#include<cstdlib>//面向对象/*C++在执行过程当中4个区域:代码区:存放二进制代码,由操作......
  • C++基础语法4()
    #include<iostream>usingnamespacestd;//标注空间#include<string>#include<time.h>#include<cstdlib>//函数的提高1;函数的默认参数函数的形参可以有默认值!返回类型......
  • C++ 基础语法5(封装、访问权限)
    #include<iostream>usingnamespacestd;//标注空间#include<string>#include<time.h>#include<cstdlib>//C++当中面向对象三大特性:封装、继承、多态//C++当中万事万物都能......
  • c++中内存分类
    局部变量,存储位置:栈,存储时间:变量所在程序运行时间全局变量,存储位置:静态存储区,存储时间:程序运行时间static静态变量,存储位置:静态数据区,存储时间:第一次初始化到程序运行结......
  • C++基础
    I/Ocout保留有效数字问题C++中cout默认保留六位有效数字,并且进行四舍五入修改保留数的方法cout.precision(2);//用这个来改变默认保留几位小数cout<<"保留两位有效:......
  • python/c++ 混合编程
    官方简介pybind11isalightweightheader-onlylibrarythatexposesC++typesinPythonandviceversa,mainlytocreatePythonbindingsofexistingC++code.......
  • C++获取含有中文字符的string长度
    :前言造车轮的时候要用到中文字符串的长度辨别,发现char的识别不准,进行了一番研究。>开始研究在Windows下,中文字符在C++中的内存占用为2字节,此时采用字符串长度获取函......