在使用任何名字空间之前,编译器必须能够找到他,即确定他的声明所在的作用域。使用某个名字空间中的名字最简单的方式就是使用限定名字,即把名字空间的名字(如ns1)作为前缀,然后加上作用域操作符(::)。
然而又是可能不愿使用名字空间以追求代码简洁。可以通过下面实现:

1.使用using指令

如:using namespace std;
语法:关键字using,关键字namespace,一个名字空间名字。using指令指导编译器把该名字空间的名字视为全局一般对待。

2.使用using声明
如:using ns1::rational;
比起using指令,使用using声明会更加具体,从而减少了危险性。using声明将另一个名字空间中的某个名字引入到局部作用域中。
using声明将名字加入到局部作用域中,起到同显示声明它一样的效果。因此,在使用using声明的作用域内使用被声明的名字时不需要加上限定(如rational)。

3.对比using指令与using声明
#include <iostream>
#incldue <ostream>
 
void demonstrate_using_directive()
{
    using namespace std;
    typedef int ostream;
    ostream x(0);
    std::cout<<x<<"\n";
}

void demonstrate_using_declaration()
{
    using std::ostream;
    typedef int ostream;
    ostream x(0);
    std::cout<<x<<'\n';
}
局部变量ostream和using声明冲突,但和using指令不冲突。对于一个名字,一个局部作用域中只能有一个对象或类型使用该名字,而using声明会把该名字加入到该局部作用域中,但using指令不会。

4.类中的using声明
using声明也可以引入类的某个成员,和名字空间的using声明不同,不能随意向任何存在的类引入任何存在的成员,但是可以向某个派生类引入其积累的某个名字。在几种场合中需要使用它,常见的有如下两个:
1)基类声明了某个函数,其派生类也声明了一个同名函数,且希望能通过重载找到这两个函数。编译器只会在单一的类作用域中寻找重载,使用using声明将基类函数引入派生类作用域,则在处理重载时,就会在派生类作用域中查找这两个函数,并选出最佳匹配项。
2)在私有继承时,通过在派生类的公有段使用using声明,可以有选择地公开一些成员。
例:
#include <iostream>
#incldue <ostream>

class base
{
    public:
        void print(int i)
        {
            std::cout<<"base:"<<i<<"\n";
        }
};
class derived1:public base
{
    public:
        void print(double d)
        {
            std::cout<<"derived:"<<i<<"\n";
        }
};
class derived2:public base
{
    public:
        using base::print;
        void print(double d)
        {
            std::cout<<"derived:"<<i<<"\n";
        }
};
int main()
{
    derived1 d1;
    derived2 d2;
   
    d1.print(42);
    d2.print(42);
}
输出:
derived:42
base:42

c++名字空间指令与名字空间声明相关推荐

  1. qt开发环境 - c++之输入,输出,名字空间定义,名字空间指令,名字空间声明

    #include <QCoreApplication> #include <iostream>using namespace std;//包含后就不用 std::cout了,直 ...

  2. inc si指令的作用_C|函数调用、汇编指令、栈空间及操作

    函数是任何编程语言不可缺少的语法机制,函数通常包括函数声明.定义.调用.调用及多层嵌套调用时会有一个回溯的问题,也就是回到原来函数调用的位置,如何实现呢,使用栈的后进先出机制.类似于你去一个地方,经过 ...

  3. python全局名称空间_python之名称空间知识点整理

    命名空间的定义 python解释器在加载py文件时在内存中开辟的空间,该空间使用字典来存放对象与值.字典的键保存了py文件中的变量名.方法名.类名及其他环境变量名,对应的值保存了该对象的值(或内存地址 ...

  4. oracle创建表不在对应表空间,oracle创建表空间

    创建表空间参数详解 语法描述: CREATE [UNDO]  TABLESPACE tablespace_name [DATAFILE datefile_spec1 [,datefile_spec2] ...

  5. MySQL如何判别InnoDB表是独立表空间还是共享表空间

    InnoDB采用按表空间(tablespace)的方式进行存储数据, 默认配置情况下会有一个初始大小为10MB, 名字为ibdata1的文件, 该文件就是默认的表空间文件(tablespce file ...

  6. oracle创建表空间 扩展表空间文件 修改表空间自动增长

    1. 创建表空间 create tablespace SIRM2  datafile 'D:\oracle\product\10.2.0\oradata\orcl\SIRM2.dbf' size 10 ...

  7. oracle表空间,角色,权限,表,索引,序列号,视图,同义词,约束条件,存储函数和过程,常用数据字典,基本数据字典信息,查看VGA信息,维护表空间,创建表空间等信息

    查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select * fr ...

  8. python 3.28 第三章 函数嵌套/名称空间//内置名称空间/全局名称空间/局部名称空间/作用域/函数对象/闭包函数。...

    1 函数嵌套: 函数内可以调用了其他的函数. # def max2(x,y):# if x > y:# return x# else:# return y## def max3(x,y,z):# ...

  9. oracle 如何修改表空间,ORACLE修改表空间方法

    1.使用imp/exp.先导出源库,再建立新库把表空间建立好,而后再导入.(听说这样能够,前提是新的库里面不能有与源库相同名字的表空间.有待验证!) 2.使用脚本进行修改.据目前所了解,正长状况下须要 ...

最新文章

  1. React 项目 -ES6 语法类的继承 (10)
  2. python代码写好了怎么运行视频-Python的初学者你现在可以自己“看”到代码的运行了!...
  3. hashmap为什么线程不安全_面试官:你说 HashMap 线程不安全,它为啥不安全呢?...
  4. 计算机绘图中特征建模的概念,2016年电大 -机械cadcam计算机辅助设计制造习题集.doc...
  5. java固定数组_Java在固定长度的数组里加入一个数
  6. C语言课后习题(24)
  7. Python菜鸟入门:day08函数概念
  8. c语言蓝色字体,C 语言输出不同颜色字体
  9. icinga+cacti整合
  10. 16位汇编第一讲简介
  11. 理解拉普拉斯平滑 Laplace Smoothing
  12. 改编码格式_CAD多行文字编码讲解
  13. 可重入锁模拟三个线程之间的通信
  14. WPS使用宏操作——减少重复性操作,提高效率
  15. php怎么插入画笔,ps画笔怎么设置
  16. java心电图_使用原生js+canvas实现模拟心电图
  17. java.lang.NoSuchMethodError:javax.persistence.PersistenceContext.synchronization()Ljavax/persistence
  18. JavaScript Reflect 学习笔记
  19. String的使用方法
  20. 中英文标点符号切换的组合键_最全的键盘各键及组合键功能说明,好好学习

热门文章

  1. openCV5-Threshold and Mask
  2. SAP 检验批决策增强
  3. 腾讯X5浏览器简单使用
  4. back-end 后端开发面试题
  5. 贝尔生物再度备战上市:拟赴上交所主板IPO,已实现连续盈利
  6. 抓取chrome所有版本密码
  7. 通过各种实践活动 培养学生道德品质
  8. JSON.stringify() 详解
  9. 使用HTML+CSS制作一个简单的网页
  10. SMD电容极性的区分