前言
相信大家在看到这篇文章时,对c语言已经有较深的理解,或者有基本的了解,因为有c语言的基础后,对c++才能更快的上手,有对比才会有更好的理解。
输入输出流
输入输出流的概念
在学习c语言的时候,我们把从键盘上获取一个数据称为 :数据的输入;将数据输出到屏幕或者输出到其他设备称为输出,而管理这两个区域称为数据缓冲区。
而在c++里面输入与输出可以看做是一连串的数据流,输入即可视为从文件或键盘中输入程序中的一串数据流,而输出则可以视为从程序中输出一连串的数据流到显示屏或文件中。
这里,c++与c语言不同的是,在缓冲区的基础上,明确了数据的一个传输方向,即输入流和输出流。
输入流: 从输入设备流向内存的字节序列
输出流: 从内存流向输出设备的字节序列
cout和插入运算符 <<
当程序执行都cout语句时,遇到<<运算符就会将要是输出的信息插入到输出流中去,最终将输出流中的数据会被输出到标准输出设备(通常为屏幕)上去。
#include <iostream>
using namespace std;
int main(void){
int x = 10;
cout << x << endl;
return 0;
}
这里发生了一个小插曲,我在定义main函数的时候,将返回值写为void,然后编译出现以下报错:
test.cpp:5:15: error: ‘::main’ must return ‘int’
void main(void){
后来查阅了解到,在C++中,main 函数的返回值不能是 void,它必须指定一个确定的整数类型。这是由C++语言标准规定的,C++98和C++11标准都规定了main函数的返回类型必须是 int。
详细原因大家可以看看这个博主的,讲解的很细
大家看到这里的时候想想,我们在c语言里,输出x的时候,是不是需要加数据输出的格式呢,但在这里c++输出时自动判断基本数据类型的类型,
cout的优势在于自动解析这些基本数据类型。当然cout也可以格式化输出
输出结果如下:
cin和析取运算符 >>
当程序执行到cin语句时,就会停下来等待键盘数据的输入。输入数据被插入到输入流中,数据输完后按Enter键结束。当遇到运算符>>时,就
从输入流中提取一个数据,存入变量x中。
但需要说明以下几点:
1.在一条cin语句中可以同时为多个变量输入数据。 各输入数据之间用一个或多个空白作为间隔符
#include <iostream>
using namespace std;
#include <cstdio>
int main(void){
int x, y, z;
#if 0
scanf("%d %d %d", &x, &y, &z);
printf("%d %d %d\n", x, y, z);
#endif
cin >> x >> y >> z;
cout << x << " " << y << " " << z << endl;
return 0;
}
2.cin具有自动识别数据类型的能力,析取运算符>>根据它后面的变量类型从输入流中为他们提取对应的数据。
比如: cin >>x;
假设输入数据2, 析取运算符>>将根据其后x的类型决定输入的2到底是数字还是字符。若x是char类型,则2就是字符;若x是int,float
之类的类型,则2就是一个数字。
假设输入34,且x是char类型,则只有字符3被存储到x中,4将继续保存在流中。
#include <iostream>
using namespace std;
int main(void){
int a;
double b;
char c;
cin >> a >> b >> c; //12.34a
cout << "a: " << a << " b: " << b << " c: " << c << endl;
return 0;
}
名字空间
名字空间的由来
1.最初C++标准中并没有名字空间,要求程序中全局作用域中声明的变量、函数、类型等必须具有唯一的名字。如果在同一个程序中有两个名字
相同的全局变量将产生命名冲突(和C语言一样)。
2.如果程序中引入第三方库就必须保证程序中定义的全局名都不能与所用库中的名字相同,否则就会产生冲突,这就是所谓的全局名字空间污染
问题,该问题在大型程序中处理起来非常困难。为此引入了名字空间。
3. 在一个名字空间中,可以定义许多不同对象,并将这些对象的有效范围局限在名字空间内。不同名字空间中,可以定义相同名称的对象,只要
两个同名对象不在同一名字空间中,就不会引起冲突。
名字空间的定义
1.语法格式
namespace xxx_namespace{
membes;
}
咱们来个实例吧,如:
namespace ABC{
int num;
struct stu{
int age;
char *name;
};
double add(int a, int b) {
return (double)a+b;
}
int Min(int a, int b){
return a>b?a:b;
}
}
名字空间成员的访问
访问名字空间成员一般有三种方法
1.通过作用域限定符(::)
#include <iostream>
using namespace std;
namespace ns1{
void func(void){
cout << "ns1 func" << endl;
}
}
namespace ns2{
void func(void){
cout << "ns2 func" << endl;
}
}
int main(void){
ns2::func();
ns1::func();
return 0;
}
结果如下:
2.引用名字空间单个成员
#include <iostream>
using namespace std;
namespace ns1{
void func(void){
cout << "ns1 func" << endl;
}
}
namespace ns2{
void func(void){
cout << "ns2 func" << endl;
}
}
int main(void){
using ns1::func;
func();
return 0;
}
运行结果如下:
3.引用名字空间全部成员
#include <iostream>
using namespace std;
namespace ns1{
void func(void){
cout << "ns1 func" << endl;
}
int a = 100;
}
namespace ns2{
int a = 200;
void func(void){
cout << "ns2 func" << endl;
}
}
int main(void){
using namespace ns1;
func();
cout << a << endl;
return 0;
}
结果如下:
无名名字空间
未命名的名字空间称作无名名字空间。
#include <iostream>
//using namespace std;
namespace ns1{
void func(void){
std::cout << "ns1 func" << std::endl;
}
int a = 100;
}
namespace ns2{
int a = 200;
void func(void){
std::cout << "ns2 func" << std::endl;
}
}
namespace{ //无名名字空间
int a = 300;
}
int main(void){
//using namespace ns1;
ns2::func();
ns1::func();
std::cout << ns1::a << std::endl;
std::cout << ::a<< std::endl; //无名名字空间成员的引用
return 0;
}
结果如下:
通过代码知,我们对无名字空间成员的访问只要加上作用域限定符就好了!
注意!!!这里我们没有使用引用名字空间全部成员的方法来访问std,使用的是作用域限定符,咋们就现学现卖嘛,加深我们对名字空间访问方法的影响。
名字空间的嵌套
指定义在其他名字空中的名字空间。
#include <iostream>
using namespace std;
namespace ns1{
void func(void){
std::cout << "ns1 func" << std::endl;
}
int a = 100;
namespace ns2{
int b = 111;
}
}
int main(void){
cout << ns1::ns2::b << endl;
return 0;
}
同样展示下结果:
到这里,有关输入输出流和名字空间的介绍就到这里啦,满满的干货!!!希望各位小伙伴们,动手敲敲加深影响哦!最后,愿各位看完觉得楼主讲的还行的话,动动小手一键三连一波!!!很需要您的支持!后续还会持续更新哦,当然,如有不对的地方还请大家指针批评!!!886