C++ 高级篇(二)—— 名空间 (Namespaces)

通过使用名空间(Namespaces)我们可以将一组全局范围有效的类、对象或函数组织到一个名字下面。换种说法,就是它将全局范围分割成许多子域范围,每个子域范围叫做一个名空间(namespaces).

使用名空间的格式是:

	namespace identifier{namespace-body}

这里identifier 是一个有效的标示符,namespace-body 是该名空间包含的一组类、对象和函数。例如:

	namespace general{int a, b;}

在这个例子中,a 和 b 是名空间general中的整型变量。要想在这个名空间外面访问这两个变量,我们必须使用范围操作符::。例如,要想访问前面的两个变量,我们需要这样写:

general::a
general::b

名空间(namespaces)的作用在于全局对象或函数很有可能重名而造成重复定义的错误,名空间的使用可以避免这些错误的发生。例如:

    // namespaces#include <iostream.h>namespace first {int var = 5;}namespace second {double var = 3.1416;}int main () {cout << first::var << endl;cout << second::var << endl;return 0;}   
5
3.1416

在这个例子中,两个都叫做var全局变量同时存在,一个在名空间first 下面定义,另一个在 second下面定义,由于我们使用了名空间,这里不会产生重复定义的错误。


名空间的使用 (using namespace)

使用 using 指令后面跟namespace可以将当前的嵌套层与一个指定的名空间连在一起,以便使该名空间下定义的对象和函数可以被访问,就好像它们是在全局范围内被定义的一样。它的使用遵循以下原型定义:

using namespace identifier;

例如:

    // using namespace example#include <iostream.h>namespace first {int var = 5;}namespace second {double var = 3.1416;}int main () {using namespace second;cout << var << endl;cout << (var*2) << endl;return 0;}			
3.1416
6.2832

在这个例子中的main函数中可以看到,我们能够直接使用变量var 而不用在前面加任何范围操作符。

这里要注意,语句using namespace 只在其被声明的语句块内有效(一个语句块指在一对花括号{}内的一组指令),如果using namespace是在全局范围内被声明的,则在所有代码中都有效。例如,如果我们想在一段程序中使用一个名空间,而在另一段程序中使用另一个名空间,则可以像以下代码中那样做:

    // using namespace example#include <iostream.h>namespace first {int var = 5;}namespace second {double var = 3.1416;}int main () {{using namespace first;cout << var << endl;}{using namespace second;cout << var << endl;}return 0;}   
5
3.1416

别名定义(alias definition)

我们以可以为已经存在的名空间定义别名,格式为:

namespace new_name = current_name ;  

标准名空间(Namespace std)

我们能够找到的关于名空间的最好的例子就是标准C++ 函数库本身。如ANSI C++ 标准定义,标准C++库中的所有类、对象和函数都是定义在名空间std下面的。

你可能已经注意到,我们在这个教程中全部忽略了这一点。作者决定这么做是因为这条规则几乎和ANSI 标准本身一样年轻 (1997) ,许多老一点的编译器并不兼容这条规则。

几乎所有的编译器,即使是那些与ANSI 标准兼容的编译器,都允许使用传统的头文件 (如iostream.h, stdlib.h, 等等),就像我们在这个教程中所使用的一样。然而,ANSI标准完全重新设计了这些函数库,利用了模板功能,而且遵循了这条规则将所有的函数和变量定义在了名空间std下。

该标准为这些头文件定义了新的名字,对针对C++的文件基本上是使用同样的名字,但没有.h的扩展名,例如, iostream.h 变成了iostream。

如果我们使用ANSI-C++ 兼容的包含文件,我们必须记住所有的函数、类和对象是定义在名空间 std 下面的,例如:

    // ANSI-C++ compliant hello world#include <iostream>int main () {std::cout << "Hello world in ANSI-C++\n";return 0;}   
Hello world in ANSI-C++

更常用的方法是使用using namespace ,这样我们就不必在所有标准空间中定义的函数或对象前面总是使用范围操作符::了 :

    // ANSI-C++ compliant hello world (II)#include <iostream>using namespace std;int main () {cout << "Hello world in ANSI-C++\n";return 0;}    
Hello world in ANSI-C++

对于STL 用户,强烈建议使用ANSI-compliant 方式来包含标准函数库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401815.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

32位CentOS系统安装kernel-PAE支持4g以上内存

转载自http://hi.baidu.com/yinhuama/item/31e572bb0a38f2ea4ec7fd7f 32位centos系统默认安装i386的内核不支持4g的内存 用yum安装kernel-PAE yum -y install kernel-PAE>vim /boot/grub/grub.conf修改设置为默认启动&#xff0c;default1改为default0 重启服务器 reboot再执…

C++ 高级篇(一)—— 模板(Templates)

模板(Templates)是ANSI-C 标准中新引入的概念。如果你使用的 C 编译器不符合这个标准&#xff0c;则你很可能不能使用模板。 函数模板( Function templates) 模板(Templates)使得我们可以生成通用的函数&#xff0c;这些函数能够接受任意数据类型的参数&#xff0c;可返回任意类…

Java笔试之Singleton

单例模式的出现&#xff0c;其主要的目的是为了使一个类只有一个实例存在。 实现单例模式主要有两种方式&#xff08;我所知道的&#xff09; 饿汉式&#xff1a;不管有没有需要&#xff0c;都在内部先new出一个实例public class Singleton{//私有的默认构造子 private Single…

Linux--文件结构体struct file

代码:struct file {   struct file *f_next&#xff0c;**f_pprev;   struct dentry *f_dentry;   struct file_operations *f_op;   mode_t f_mode;   loff_t f_pos;   unsigned int f_count&#xff0c;f_flags;   unsigned long f_reada&#xff0c;f_…

PPT到底是天使还是魔鬼?

说老实话&#xff0c;我非常不喜欢那些PPT的培训者一味地鼓吹PPT的重要性&#xff0c;视觉化思维的重要性&#xff0c;PPT在演讲中的重要性等等&#xff0c;我很清楚他们这么说是因为他们必须这么说&#xff0c;因为如果不把PPT的重要性强调一下&#xff0c;谁来上他的课呢&…

ultraedit正则表达式

一般使用ultraedit中的Perl风格的正则表达式&#xff0c;下面是perl正则的基本语法 perl中的元字符如下&#xff1a; ^ 表示一行的开头&#xff1b; $ 表示一行的结尾&#xff1b; ( ) 表示一个匹配块的&#xff0c;可以对匹配上的块通过$1,$2...进行读取&#xff0c;…

微软云介绍

微软云介绍 http://msdn.microsoft.com/zh-cn/ff380142 什么是云开发&#xff1f;&#xff08;概述&#xff09; 云计算是指远程运行并通过 Internet 访问的计算机和应用程序。在云计算中&#xff0c;虚拟机在大型数据中心中运行&#xff0c;并取代了物理 PC 和服务器。通过将许…

IO端口和IO内存的区别及分别使用的函数接口

IO端口和IO内存的区别及分别使用的函数接口 每个外设都是通过读写其寄存器来控制的。外设寄存器也称为I/O端口&#xff0c;通常包括&#xff1a;控制寄存器、状态寄存器和数据寄存器三大类。根据访问外设寄存器的不同方式&#xff0c;可以把CPU分成两大类。一类CPU&#xff08…

DHCP服务开启了,为什么老是网络冲突

<b><a target"_blank" href"http://www.hnbkhb.com/ " >河南</a><a target"_blank" href"http://www.hnzzfk.com/ " >河南</a><a target"_blank" href"http://www.0371fkyy.com/ &qu…

Linux进程状态解析之R、S、D、T、Z、X

Linux进程状态解析之R、S、D、T、Z、X&#xff1b;Linux是一个多用户&#xff0c;多任务的系统&#xff0c;可以同时运&#xff1b;众所周知&#xff0c;现在的分时操作系统能够在一个CPU上运&#xff1b;在linux系统中&#xff0c;每个被运行的程序实例对应一个&#xff1b;Li…

Win8 HTML5与JS编程学习笔记(二)

近期一直受到win8应用的Grid布局困扰&#xff0c;经过了半下午加半个晚上的奋斗&#xff0c;终于是弄明白了Grid布局方法的规则。之前我是阅读的微软官方的开发教程&#xff0c;书中没有详细说明CSS3的布局规则&#xff0c;自己鼓捣了半天也是一头雾水&#xff0c;于是又找到了…

flsah的分类

1. flash按照内部存储结构不同&#xff0c;分为两种&#xff1a;nor flash和nand flash。 nor flash&#xff1a;像访问SDRAM一样&#xff0c;按照数据/地址总线直接访问, 可写的次数较少&#xff0c;速度也慢&#xff0c;由于其读时序类似于SRAM&#xff0c;读地址是线性结构&…

Oracle EXP/IMP参数详解

exp/imp是Oracle自带的导入导出命令&#xff0c;运用它&#xff0c;即使不需要那结UI工具也能轻易的完成数据导出导入工作&#xff0c;下面是它们的参数&#xff1a;EXP参数详解使用的格式是&#xff1a;EXP KEYWORDvalue 或 KEYWORD(value1,value2,...,valueN)其中USERID是必须…

java每日小算法(10)

/*【程序10】 题目&#xff1a;一球从100米高度自由落下&#xff0c;每次落地后反跳回原高度的一半&#xff1b;再落下&#xff0c;求它在 第10次落地时&#xff0c;共经过多少米&#xff1f;第10次反弹多高&#xff1f; */ package test;public class test {public static vo…

C语言串口驱动程序

驱动层屏蔽了硬件细节&#xff0c;个人猜测&#xff0c;几乎所有移植好的系统的串口&#xff0c;都可以用一样的代码来操作&#xff0c;至少2440和树莓派是通用的。 分享代码如下&#xff1a; [cpp] view plaincopy #include <sys/types.h> #include <sys/stat.h>…

Windows下的Qt Creator的安装

采用Qt和Qt creator分别下载和安装的方式&#xff1a;&#xff08;需要手动设置关联Qt和Qt Creator&#xff09; 一、软件下载 从http://qt-project.org/downloads分别下载Qt和Qt Creator&#xff1a; Qt使用4.7.2版本&#xff1a;qt-win-opensource-4.7.2-mingw.exe Qt Creato…

进程 、进程组、会话、控制终端之间的关系

一个进程组可以包含多个进程 进程组中的这些进程之间不是孤立的&#xff0c;他们彼此之间或者存在者父子、兄弟关系&#xff0c;或者在功能有相近的联系。 那linux为什么要有进程组呢&#xff1f;其实提供进程组就是方便管理这些进程。假设要完成一个任务&#xff0c;需要同时并…

matlab保存数据

一&#xff1a;存txt文件&#xff0c;用dlmwrite()dlmwrite 将一个矩阵写到由分隔符分割的文件中。 在保存整数到文件时使用save存为ascii文件时&#xff0c;常常是文件里都是实型格式的数据&#xff08;有小数点&#xff0c;和后面很多的0&#xff0c;看着很不方便&#xff09…

linux下串口的阻塞和非阻塞操作

有两个可以进行控制串口阻塞性&#xff08;同时控制read和write&#xff09;&#xff1a;一个是在打开串口的时候&#xff0c;open函数是否带O_NDELAY&#xff1b;第二个是可以在打开串口之后通过fcntl()函数进行控制。 阻塞的定义&#xff1a; 对于read&#xff0c;block指当串…

串口初始化配置

在基于AT91的嵌入式linux中接收串口数据时&#xff0c;发现对于接收的数据经常出现接收不完整的现象。一帧的数据可能会被当做两帧接收&#xff0c;导致对于一帧数据接收出现问题。虽然这种情况在一般情况下&#xff0c;并不是经常出现&#xff0c;但是只要数据量稍微大一些&am…