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

目录
  • C++命名空间
    • 1.概述
    • 2.格式
    • 3.定义范围
    • 4.瀑布式开发格式
    • 5.命名空间的访问方式
      • 5.2using namespace 空间名
    • 6.命名空间可以无限嵌套
    • 7.权限
    • 8.匿名命名空间
    • 9.别名
    • 10.编程模型
    • 11.using语法使用

C++命名空间

1.概述

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

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

2.格式

namespace 空间名称
{
    变量名称
    .....
    函数声明
    .....
}

3.定义范围

#include <iostream>
using namespace std;

namespace test#这是正确的命名形式
{
    .....
}

int main()
{
namespace test01 #这是错误的命名形式
{

}
    ....
}

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

4.瀑布式开发格式

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

#include <iostream>
using namespace std;
namespace test
{
 ....
}
namespace test #名称相同就是同一个命名空间
{
    .......
}

int main()
{
    ........
}

5.命名空间的访问方式

5.1空间名::变量名

#include <iostream>
using namespace std;
namespace test
{
    int a = 10;
}
int main()
{
    cout << test::a<<endl;

    .....
}

5.2using namespace 空间名

#include <iostream>
using namespace std;
namespace test
{
    int a = 10;
}
using namespace test;#需要在命名空间定义之后
int main()
{
    cout <<a<<endl;

    .....
}

需要注意的是:

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

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

#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.匿名命名空间

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

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

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

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

#include <iostream>
using namespace std;

int a = 10;
namespace #这就是匿名命名空间
{
  int a = 20;
}
int main()
{
    cout << a <<endl;
    .....
}

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

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

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

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

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

#include <iostream>
using namespace std;

int a = 10;
namespace #这就是匿名命名空间
{
  int a = 20;
}
int main()
{
    cout << ::a <<endl;
    .....
}

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

结果是10!!!

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

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

#include <iostream>
using namespace std;

namespace #这就是匿名命名空间
{
  int a = 20;
}
int main()
{
    cout << a <<endl;  #调用原生全局变量的方式
    .....
}

9.别名

#include <iostream>
using namespace std;

int a = 10;
namespace test
{
  int a = 20;
}
namespace alise_test = test;#这就是给命名空间

int main()
{
    cout << ::a <<endl;
    .....
}

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

#include <iostream>
using namespace std;

int a = 10;
namespace test
{
  int a = 20;
}
namespace alise_std = std;#这是不建议的一种做法

int main()
{
    cout << ::a <<endl;
    .....
}

10.编程模型

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

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 空间名;

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

#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:如果没有引用,命名空间里的代码块就不会被编译

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

#include <iostream>
using namespace std;

namespace test
{
  int a = 20;
}
using namespace test::a; #只使用test命名空间中的a变量
int main()
{
    cout << a <<endl;
    .....
}

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

(0)

相关推荐

  • 示例详解C++语言中的命名空间 (namespace)

    目录 前言 1. 命名空间 2. using 指令 3. 不连续的命名空间 4. 嵌套的命名空间 5. 命名空间内变量.函数.全局变量的作用域 5.1 using namespace first_space; 5.2 using namespace first_space::second_space; 总结 前言 命名空间可作为附加信息来区分不同库中相同名称的函数.类.变量等.命名空间即定义了上下文,命名空间就是定义了一个范围. 一个文件夹 (目录) 中可以包含多个文件夹,每个文件夹中不能有相同

  • 实例讲解C++ 命名空间

    假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等. 同样的情况也出现在 C++ 应用程序中.例如,您可能会写一个名为 xyz() 的函数,在另一个可用的库中也存在一个相同的函数 xyz().这样,编译器就无法判断您所使用的是哪一个 xyz() 函数. 因此,引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数.类.变量等.使用了命名空间即定

  • C/C++中命名空间(namespace)详解及其作用介绍

    目录 概述 命名空间 命名空间的作用 自定义命名空间 命名空间成员的方法 案例 概述 命名空间 (namespace) 可以帮助我们区分不同库中相同名称的函数, 类, 变量等. 使用了命名空间即定义了上下文. 命名空间就是定义了一个范围. 命名空间 为了解决 C++ 标准库中的标识符与程序中的全局标识符之间以及不同库中的所有标识符之间的命名冲突. 标准 C++ 库的所有标识符都定义在一个名为 std 的命名空间中. 在程序中用到 C++ 标准库时, 使用 std 作为限定. 我们在写 "Hell

  • C++命名空间namespace的介绍与使用

    介绍 命名空间可以解决程序中的同名冲突,尤其大型项目多人开发中经常用到.比如我们使用C++的标准输出std::cout就使用了std命名空间. 语法: namespace XXX { class A { public: ... }; } //没有分号 在某些第三方库中是有namespace的,因此我们在使用这些库的时,要确定是否使用using namespace来解除名字前缀. 使用 #include <stdio.h> namespace XXX { class A { public: vo

  • C++入门(命名空间,缺省参数,函数重载,引用,内联函数,auto,范围for)

    一.C++关键字 C++总共有63个关键字,在入门阶段我们只是大致了解一下就可,在后续博客中会逐渐讲解 二.命名空间 相信学过C++的同学,一定都写过下面这个简单的程序 #include<iostream> using namespace std; int main() { cout<<"hello world"<<endl; return 0; } 我们先来看第二行代码,using namespace std , 这行代码是什么意思呢 ? 这里我们

  • C++命名空间5种常见用法实例解析

    相信小伙伴们对C++已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述. 命名空间在1995年被引入到 c++ 标准中,通常是这样定义的: 命名空间定义了新的作用域.它们提供了一种避免名称冲突的方法. c++ 中的命名空间通常用于避免命名冲突.尽管命名空间在最近的 c++ 代码中广泛使用,但大多数较旧代码都不使用此工具. 基于对众多C++项目源码的探索与研究,总结出了在这些项目中使用命名空间的一些常见原因. 1-避免名称冲突 如前所述,这是在C++

  • C++语言基础 命名空间

    C++的命名空间的使用 C++语言引入命名空间(Namespace)这一概念主要是为了避免命名冲突,其关键字为 namespace. 科技发展到如今,一个系统通常都不会仅由一个人来开发完成,不同的人开发同一个系统,不可避免地会出现变量或函数的命名冲突,当所有人的代码测试通过,没有问题时,将所有人的代码结合到一起,因为变量或函数重名而导致的问题将会造成一定的混乱,例如: int flag = 1; //小李声明的变量 // -- //中间间隔若干行代码 bool flag = true; //小韩

  • C++编程中的命名空间基本知识讲解

    命名空间是一个声明性区域,为其内部的标识符(类型.函数和变量等的名称)提供一个范围.命名空间用于将代码组织到逻辑组中,还可用于避免名称冲突,尤其是在基本代码包括多个库时.命名空间范围内的所有标识符彼此可见,而没有任何限制.命名空间之外的标识符可通过使用每个标识符的完全限定名(例如 std::vector<std::string> vec;)来访问成员,也可通过单个标识符的 using 声明 (using std::string) 或命名空间中所有标识符的 using 指令 (C++) (usi

  • 详解C++ 动态内存分配与命名空间

    1.C++中的动态内存分配 通过new关键字进行动态内存申请 C++中的动态内存申请时基于类型进行的 delete关键用于内存释放 C语言其实是不支持动态内存分配的,是通过malloc库函数来实现的,可能有一些硬件根本不支持malloc:而C++ new是一个关键字,不管在任意编译器上,任意硬件平台上都是能够进行动态内存分配的,这是本质区别. malloc是基于字节来进行动态内存分配的,new则是基于类型来进行动态内存分配 // 变量申请: Type * pointer = new Type;

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

    目录 C++命名空间 1.概述 2.格式 3.定义范围 4.瀑布式开发格式 5.命名空间的访问方式 5.2using namespace 空间名 6.命名空间可以无限嵌套 7.权限 8.匿名命名空间 9.别名 10.编程模型 11.using语法使用 C++命名空间 1.概述 在c++中,名称(name)可以是符号常量.变量.函数.结构.枚举.类和对象等等.工程越大,名称互相冲突性的可能性越大.另外使用多个厂商的类库时,也可能导致名称冲突.为了避免,在大规模程序的设计中,以及在程序员使用各种各样

  • C++ 函数重载详情介绍

    文章转自微信公众号:Coder梁(ID:Coder_LT) 函数重载 函数重载还有一个别名叫函数多态,其实我个人感觉函数多态这个名字更好理解更恰当一些. 函数多态是C++在C语言基础上的新特性,它可以让我们使用多个同名函数.当然这些同名函数的参数是要有区别的,我们在函数调用的时候,编译器会自动根据我们传入的参数,从多个同名函数当中找到我们调用的那一个.和面向对象里的多态的概念很接近. 我们在定义函数的时候,编译器只会查看参数的数目和类型,而不会理会参数的名称.只要参数的数量以及类型不完全相同,就

  • Springboot-Shiro基本使用详情介绍

    目录 一.依据官网快速搭建Quickstart 1.1 配置pom.xml依赖 1.2配置log4j.properties 1.3 配置shiro.ini 1.4启动类 二.springboot结合shiro使用 2.1准备数据库 2.2配置yaml 三.实体类 3.1UserMapper即UserMapper.xml 四.shiro的配置类 五.启动类 5.1SecurityUtils. getSubject() Apache Shiro官网:https://shiro.apache.org/

  • Python的装饰器详情介绍

    目录 1.定义及使用 2.@classmethod 1.定义及使用 例1:装饰器定义: def 装饰器函数(外部函数):            def 内联函数(*args,**kwargs):                ...前置装饰...                外部函数(*args,**kwargs)                ...后置装饰...            return 内联函数  例2:装饰器两种调用方式 第一种:装饰器函数(外部函数)(参数1,参数2....

  • Java spring mvc请求详情介绍

    目录 一.源码执行流程 二.源码执行流程图 三.spring mvc中的一核心组件 四.源码分析 五.获取组件相关逻辑: 六.获取参数,执行方法源码分析 七.渲染视图逻辑 前言: 本文源码基于spring-framework-5.3.10. mvc是spring源码中的一个子模块! 一.源码执行流程 用户发送请求至前端控制器DispatcherServlet. DispatcherServlet收到请求调用处理器映射器HandlerMapping.处理器映射器根据请求url找到具体的处理器,生成

  • C++ 多继承详情介绍

    C++支持多继承,即允许一个类同时继承多个类. 关于多继承,一直以来争议不断,有一部分人认为多继承会带来大量的问题,为了解决这些问题会使得语言本身变得非常复杂,因此应当避免.另外一派认为多继承在某些场景下可以起到非常关键的作用,应当予以支持. 关于多重继承是好是坏,这是一个非常复杂的问题,网上历来争议不断.因此不过多阐述,感兴趣的同学可以查阅一下相关资料.仅仅从实际支持来看,目前市面上大部分的语言包括Java仅支持单继承,只有C++等少数语言支持多继承.这和C++的理念也有关,即认定不能通过减少

  • C++链表类的封装详情介绍

    目录 1.CList.h 2.CList.cpp 3.main.cpp 1.CList.h #ifndef CLIST_H #define CLIST_H   class CNode         //节点类 { public:     CNode();     ~CNode();     void *data;     //数据域  节点数据的地址     CNode *pnext;   //指针域  保存下一个节点的地址 protected: private: };   class CLi

  • Vue数据劫持详情介绍

    目录 前言 创建Vue实例 数据观测存在的问题 结语 前言 Vue会对我们在data中传入的数据进行拦截: 对象:递归的为对象的每个属性都设置get/set方法 数组:修改数组的原型方法,对于会修改原数组的方法进行了重写 在用户为data中的对象设置值.修改值以及调用修改原数组的方法时,都可以添加一些逻辑来进行处理,实现数据更新页面也同时更新. Vue中的响应式(reactive): 对对象属性或数组方法进行了拦截,在属性或数组更新时可以同时自动地更新视图.在代码中被观测过的数据具有响应性 创建

  • sql注入数据库原理详情介绍

    目录 1 介绍 2 一般步骤 3 注入 3 函数 3.1 常用的系统函数 3.2 字符串连接函数 3.2.1 concat() 函数 3.2.2 concat_ws() 函数 3.2.3 group_concat() 函数 4 注入 4.1 联合查询 union 注入 4.2 information_schema 注入 5.2.1 获取所有数据库 4.2.2 获取指定数据库的表 4.2.3 获取指定表的字段名 4.2.4 获取字段值得内容 4.3 基于报错信息注入 4.3.1 三个常用报错函数

  • C++运算符重载详情介绍

    文章转自公众号:Coder梁(ID:Coder_LT) C++当中除了函数可以重载之外,其实运算符也是可以重载的.我们之前已经接触过一些,可能大家没有意识到. 举个例子,乘号*,运用在指针上,就是取值的意思,而运用在算数当中,则是乘法的意思.同样一个符号,用在不同的地方,起到了不同的效果.这其实就是一种重载,C++根据操作数的数目和类型来决定要使用哪一种操作. 另外C++允许将运算符重载扩展到用户自定义的类型,也就是结构体和类当中.比如,我们可以将重载加号,对两个对象相加. 其实这种用法也出现过

随机推荐