【C++】命名空间和IO流

一切都从这个代码开始!!! 

#include<iostream>

using namespace std;

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

命名空间

当我们写了这么一段代码的时候...

c9150929dc0c4d8d9944d8fb7e9a6b73.png

Ctrl F5运行,发现报错了....

58c8c2e85f154aa29a1e7923aa079f76.png

这是因为在stdlib库里有一个rand函数,而我们又好巧不巧的在全局定义一个变量rand,这就让编译器有点不知所措,于是报错。

命名冲突的问题不仅发生在我们写的代码和库里的冲突,也包括在写项目时,两个程序员使用的名称冲突。所以

C++为了解决这样的问题,提出了"命名空间"这个概念。

1.使用

#include<stdio.h>
namespace whh
{
	int num = 3;
}

int main()
{
	printf("%d\n", whh::num);
}

上面的代码就表示在“whh”这块命名空间里定义了一个变量num。

域作用限定符::

但是在函数体中使用的时候可以注意到和C语言不同的地方有多加了一个whh :: num,其中::就被称为域作用限定符,他表示的是这里使用的是whh这个命名空间里的num。

如果不指定默认访问全局函数,没有就会报错,如果通过域作用限定符指定了就访问该命名空间中的,没有同样也会报错。

注意:

1.命名空间可以定义变量,函数,结构体...

2.命名空间也可以嵌套。

#include<stdio.h>
namespace whh
{
	int num = 3;

	int  Add(int x, int y)
	{
		return x + y;
	}

	struct Node
	{
		struct Node* next;
		int val;
	};

	namespace whh2
	{
		int big = 9;
	}
}

int main()
{
	//使用变量
	printf("%d\n", whh::num);
	//使用函数
	int a = 2, b = 3;
	int c = whh::Add(a, b);
	//使用结构体
	struct whh::Node node;	//注意whh::的位置在struct之后Node之前
	//嵌套
	int small = whh::whh2::big;
}

3.如果函数定义和声明分离,可以各封各的,命名空间的名称不会冲突 ,同个项目下相同名称的命名空间会自动合并。

2.展开命名空间

但是在确定不会有命名冲突的情况下,每次指定命名空间很繁琐,可以通过展开命名空间来解决。

直接在头文件下添加using namespace xxx;即可。

using namespace wjw;

这样不用每次使用时都指定命名空间了。

C++官方库里也有很多我们经常使用的函数、变量等,可以通过↓展开。

using namespace std;

C++官方库的命名空间平时练习可以直接展开,但是写工程项目时不要直接都展开。

如果所有命名空间都展开了,先找全局,再按展开顺序挨个找,找到为止。


iostream IO流

以上解决了为什么开头Hello world的代码为什么要加上using namespace std;

至于是什么地方使用到std库里的东西了呢,答案是cout

<< 流插入

在C++中<<是个运算符,叫作流插入,和cout 一起就相当于C语言中的printf,不过cout可以自动识别输出变量的类型,不需要格式化输出,可以连续输出。

int a = 0;
double b = 8.9;
char c = 'a';
cout << a << b << c;

c就是console(控制台)的缩写。

如果不展开std库,想要在屏幕上输出“Hello world!”就需要指定命名空间

std::cout << "Hello world!";

C++中的换行

  1. 字符串后加\n  “XXXXX\n”
  2. 打印换行字符串 cout << xxx << "\n";
  3. 打印换行字符 cout << xxx << '\n';
  4. 使用换行关键字 cout << xxx << endl;

不过endl也是库里的,如果不展开std就需要在前面指定std::endl

问题在于,又不能直接展开std,又有这么多地方需要,这..........好吧,所以,可以

指定展开

using std::cout;
using std::endl;

这样就都解决了。

>> 流提取

printf讲了,scanf不讲就不礼貌了。它对应的是cin

不过其实用法也大差不差。

int a = 0;
double b = 0;
char c = 0;
cin >> a >> b >> c;

输入之后就可以给它们赋值了。

头文件

cout和cin使用时要包含头文件。

#include<iostream>

一般这个头文件后面是不需要.h的,然后很基础的C++也只需要包含这个头文件,不需要#include<stdio.h>,不过如果你想的话也是可以的,因为C++兼容C

那么至此,前面所写的代码一切都说得通了。


-The End-

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王_哈_哈 Jw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值