目录
一、标准输入输出
我们大家在学习C语言时,写的第一段代码应该就是 “Hello world!”,这表示着作为初学者的我们对编程世界的美好问候。那C++是否也应该对这个美好的世界来声问候呢?我们来看下C++是如何来实现问候的。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
int main()
{
cout << "Hello World" << endl;
return 0;
}
说明:
1.使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含<iostream>头文件以及按命名空间使用方法使用std。
2.cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在<iostream>头文件中。
3.<<是流插入运算符,>>是流提取运算符。
4.使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型。
5.实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识。
注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因此推荐使用<iostream>+std的方式。
除此之外,我们可以看到,与C语言不同的是,在包含头文件之后,还有一行“using namespace std”,其实std是C++标准库的命名空间,C++将标准库的定义实现都放在这个命名空间里,而“using namespace"就是对命名空间std的展开。
二、命名空间
(一)概述
在c++中,名称(name)可以是符号常量、变量、函数、结构、枚举、类和对象等等。工程越大,名称互相冲突性的可能性越大。另外使用多个厂商的类库时,也可能导致名称冲突。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入关键字namespace(命名空间/名字空间/名称空间),可以更好地控制标识符的作用域。
(二)定义
#include<iostream>
using namespace std;
//定义命名空间A
namespace A {
int a = 100;
}
//定义命名空间B
namespace B {
int a = 200;
}
int main()
{
cout << A::a << endl;//输出命名空间A中的a的值
cout << B::a << endl;//输出命名空间B中的a的值
return 0;
}
、
(三)特征
1.命名空间只能全局范围内定义
以下为错误写法:
2.命名空间可以嵌套
#include<iostream>
using namespace std;
namespace A {
int a = 100;
namespace B {
int a = 200;
}
}
int main()
{
cout << A::a << endl;
cout << A::B::a << endl;
return 0;
}
3.命名空间 可以存放 变量 和 函数
#include<iostream>
using namespace std;
namespace A {
int a = 100;//变量
void func() {
cout << A::a << endl;
}//函数
}
int main()
{
A::func();
return 0;
}
这里还可以看出,命名空间内部可以调用自己。
4.命名空间中的函数 可以在“命名空间”外 定义
#include<iostream>
using namespace std;
namespace A {
int a = 100;
void func();
}
void A::func() {
cout << A::a << endl;
}
int main()
{
A::func();
return 0;
}
5.无名命名空间
意味着命名空间中的标识符只能在本文件内访问,相当于给这个标识符加上了static,使得其可以作为内部连接。
#include<iostream>
using namespace std;
namespace {
int a = 100;
}
int main()
{
cout << a << endl;
return 0;
}
6.命名空间 取别名
#include<iostream>
using namespace std;
namespace A{
int a = 100;
}
int main()
{
namespace B = A;
cout << B::a << endl;
return 0;
}