C++基础——命名空间及如何实现输入输出

命名空间:

为什么需要命名空间?

众所周知,C++作为一种面向对象的语言,当中的变量、函数、类都是大量存在的。假如这些变量、函数、类的名称都存在于全局作用域当中,就可能会导致很多冲突。举个形象的例子,一个学校有三个年级 ,一个年级有三个班,很巧的是这个学校的每个年级的每个班级里都有一个叫小明的学生。这个学校就相当于一个全局作用域,当中的年级和班级就相当各种变量、函数和类。假如这时候校长从广播里喊话:“小明同学,请到我办公室来一下。”搞不好9个小明还都真一块过去了。这就像一些变量、函数和类在全局作用域中起了冲突。那么校长正确的叫法应该是什么呢?当然是:“某年级某班的小明同学请过来我办公室一下。”这样会过去的只有那一个真正被找的小明了,那么当中的某年级某班就是我们的命名空间啦。它的目的就是为了对标识符的名称进行本地化,从而避免命名冲突或名称污染,通俗的来讲就是一个由程序设计者命名的内存区域,程序设计者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分隔开来。

命名空间的定义

命名空间的定义使用关键字 namespace,后跟命名空间的名称:

namespace namespace_name {
   // 代码声明
}

1.创建一个普通命名空间:

//创建一个普通命名空间ns1
namespace ns1
{
	//命名空间中定义的变量和函数
	int a;
	int Add(int left, int right)
	{
		return left + right;
	}
}

2.创建一个嵌套命名空间(命名空间可以嵌套):

//创建一个嵌套类型的命名空间ns2,ns3嵌套在ns2当中
namespace ns2
{
	int a = 1;
	int b;
	int Add(int left, int right)
	{
		return left + right;
	}
	namespace ns3
	{
		int a = 2;
		int c;
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}

注意:因为命名空间中的所有内容都只局限于该命名空间中,故嵌套命名空间下同名变量不互相影响。例如:

cout << "ns2::ns3::a:" << ns2::ns3::a << endl;
cout << "ns2::a:" << ns2::a << endl;

3.创建一个名称同为ns1的命名空间(在同一个工程中允许存在多个相同名称的命名空间,编译器最后会将这些命名空间合成到同一个命名空间中):

//创建一个名称同为ns1的命名空间
namespace ns1
{
	int Mul(int left, int right)
	{
		return left * right;
	}
}

命名空间的使用

命名空间的错误使用

printf("%d\n", a);
//会导致编译出错:无法识别的字符

命名空间正确使用

1.使用命名空间名称及作用域限定符::访问命名空间:

//利用作用域限定符访问ns2命名空间中的成员变量a
printf("%d\n", ns2::a);

2.使用using引入命名空间成员:

//使用using关键字引入命名空间ns2中的成员a,然后直接可访问a
using ns2::a;
printf("%d\n", a);

3.使用using namespace引入命名空间:

//使用using namespace引入命名空间ns2中的所有成员,并对其直接使用
using namespace ns2;
printf("%d\n", a);
Add(3, 4);

C++中的输入和输出

相信大家的第一个C语言程序一定是向世界say:Hello world!那么我们的C++是不是也应该同世界问个好呢?了解了命名空间的概念以及用法,下面让我们一起来学习一下C++当中的输入和输出吧!

#include<iostream>
using namespace std;

int main()
{
    cout<<"Hello world!"<<endl;
    return 0;
}

上面这段代码的功能就是输出我们的Hello world!

C++的输入输出

C++采用cout从控制台标准输出、cin从键盘标准输入。预定义的对象 cin 是 iostream 类的一个实例。cin 对象附属到标准输入设备,通常是键盘。cin是与流提取运算符 >> 结合使用的,并且必须包含< iostream >头文件以及std标准命名空间。使用C++进行输入输出十分方便,不需要像C语言一样增加%d、%c等数据格式控制。

int aa;
double bb;
char cc;

cin >> aa;
cin >> bb >> cc;//等于cin>>bc; cin>>cc;

cout << aa << endl;
cout << bb << " " << cc << endl;

标准命名空间std

为了解决C++标准库中的标识符与程序中的全局标识符之间以及不同库中的标识符之间的同名冲突,应该将不同库的标识符在不同的命名空间中定义(或声明)。标准C++库的所有的标识符都是在一个名为std的命名空间中定义的,或者说标准头文件(如iostream)中函数、类、对象和类模板是在命名空间std中定义的。std是standard(标准)的缩写,表示这是一个存放标准库的有关内容的命名空间。所以,在程序中用到C++标准库时,需要使用std作为限定。

#include<iostream>
using namespace std;

完整实现代码

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
using namespace std;

//创建一个普通命名空间ns1
namespace ns1
{
	//命名空间中定义的变量和函数
	int a;
	int Add(int left, int right)
	{
		return left + right;
	}
}


//创建一个嵌套类型的命名空间ns2,ns3嵌套在ns2当中
namespace ns2
{
	int a = 1;
	int b;
	int Add(int left, int right)
	{
		return left + right;
	}
	namespace ns3
	{
		int a = 2;
		int c;
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}


//创建一个名称同为ns1的命名空间
namespace ns1
{
	int Mul(int left, int right)
	{
		return left * right;
	}
}


int main()
{
	//嵌套命名空间下同名变量不互相影响
	cout << "ns2::ns3::a:" << ns2::ns3::a << endl;
	cout << "ns2::a:" << ns2::a << endl;

        //命名空间错误的使用
        //printf("%d\n", a);  
        //编译出错:无法识别的字符
	
	//命名空间正确使用
	
	//1、使用命名空间名称及作用域限定符
	printf("%d\n", ns2::a);

	//2、使用using引入命名空间成员
	using ns2::a;
	printf("%d\n", a);

	//3、使用using namespace引入命名空间
	using namespace ns2;
	printf("%d\n", a);
	Add(3, 4);

	//输入&输出
	int aa;
	double bb;
	char cc;

	cin >> aa;
	cin >> bb >> cc;//等于cin>>bc; cin>>cc;

	cout << aa << endl;
	cout << bb << " " << cc << endl;

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值