前言:
小编在学习完一些数据结构以后,终于,我还是来到了这一步,开始学习我小学就听说过的C++,至于为什么标题写的C嘎嘎,因为小编觉着这样好念而且有意思,今天是小编学习C嘎嘎的第一天,为了不让我越学就忘记前面的知识,于是诞生了这一篇文章,那么现在废话不多说,开启今天的C嘎嘎之旅!
目录
❀1.C嘎嘎是什么
❀2.命名空间
❀2.1.命名空间的概念和定义
2.1.1.引例
2.1.2.命名空间的概念
2.1.3.命名空间的定义
❀2.2.命名空间的使用
2.2.1.域作用限定符 " :: "
2.2.2.第二种使用方法:用using展开所有成员(不推荐使用)
2.2.3.第三种使用办法:using展开部分成员
❀3.C嘎嘎的输入 && 输出
❀3.1.输出函数——cout
3.1.1.cout函数的概念
❀3.2.输入函数——cin
3.2.1.cin函数的概念
❀❀❀ 总结❀❀❀
正文:
❀1.C嘎嘎是什么
C嘎嘎的发明是咱们祖师爷——本贾尼教授在1979年在使用C语言的时候越来越发现C语言的一些不足,于是后来就自己开始在C语言的基础上开始增强C语言的功能(我真的佩服这些发明语言的大佬们,他们觉着语言不行就开始自己发明语言,而小编只会在各种社交app上吐槽,这就是差距),后来增加的功能越来越多,这时候就诞生了现在小编所讲的:C++!
所以说,C++其实就是C语言的一个更高级的版本,它同样是可以用C语言的一些功能的,这个小编后续讲的时候会体现出来,至于C嘎嘎之后的一些历史,小编就不多叙述了,小编文笔不太行贿,讲不了历史,下面就进入C嘎嘎的学习喽!
❀2.命名空间
命名空间是C嘎嘎比C语言多出来的功能,也是和我们之后学习息息相关的一个内容,大家一定要好好理解这个:
❀2.1.命名空间的概念和定义
2.1.1.引例
在讲命名空间的概念之前,小编先给各位一段代码让各位判断这个代码对不对:
#include<stdio.h>
int rand = 1;
int main()
{
printf("%d",rand);
return 0;
}
这个代码看上去是非常正确的,无非就是设置了一个全局变量,然后打印出变量的内容罢了,想必各位读者朋友也是这么想的,的确,这个代码是正确的,那么小编再给各位一段代码,让大家来判断这个代码是否是正确的:
#include<stdio.h>
#include<stdlib.h>
int rand = 1;
int main()
{
printf("%d",rand);
return 0;
}
到这里很多读者朋友可能会有疑问了,这个代码和上面那个·代码不就多了一个头文件吗,这俩不应该是一样的吗?其实小编这里给大家埋了个坑,请各位读者朋友看我变量名是什么:rand,这个可能很多小伙伴见过,这是一个生成随机数(伪)的库函数,小编也在之前的扫雷游戏中用过这个库函数,小编给大家看看这个库函数的介绍:
所以说上面那个代码使用起来是会报错的,下面给大家展示一下报错原因:
当然,如果rand在函数内部是不会报错的,因为在函数内部属于局部变脸,想要打印它的时候,编译器会首先在main函数内部查找,然后再往后上找,rand属于全局变脸,头文件会在预编译的的时候打开,二者都在全局,所以会重定义,那么,如果我们非要让rand作为全局变量,然后也可以使用它我们有什么方法可以实现这个操作呢?既然小编这么说了,解决办法肯定是有的,那么小编就要进入本小节所要讲的:命名空间了。
2.1.2.命名空间的概念
命名空间的存在,实际上就是为了解决小编前面说过的,为了让我们既可以使用rand函数,也可以使用全局变量rand,命名空间就是解决这个问题的关键,命名空间实际上的作用就是来隔离名字的,为了解决一些程序中由于名字冲突或者名字污染而带来的一些问题,C嘎嘎特地引入了命名空间来解决,它在编译器是用namespace关键字来表示的,下面小编讲述一下namespace的一些定义来帮助大家理解namespace是如何在代码中进行表示的:
2.1.3.命名空间的定义
1.在定义命名空间的时候,就需要用到namespace关键字,后面需要跟着名字(自己设定的,可以把它想成我们在使用结构体时对结构体命名),之后跟着一对{}即可,里面的内容可以是变量,函数,结构体等等,下面小编用代码来展示一下它的定义方法:
namespace wang
{
int rand = 20;
int add(int a,int b)
{
return a + b;
}
struct wang1
{
char arr[12];
int* arr1;
};
}
2.namespace其实本义是定义出了一个域,这个域就叫命名空间域,这个域跟全局域是隔离出来的,所以在里面放入rand函数的时候就可以不和全局域中的rand函数起冲突了,读到这里,可能会有许多读者朋友会好奇域到底是什么东西,下面小编就来介绍一下: 在C++中有着四种域,分别是全局域(就是全局变量呆着的地方),函数局部域(例如main函数内部的内容都属于函数局部域),命名空间域(上面讲的,把一些重复的名字隔离出来的域),类域(后期会学,这个我现在也不懂,我刚学C嘎嘎)。所以这里就解释了为什么命名空间可以把变量给隔离出来,因为域本身就是不同的,并且,局部域和全局域是会影响生命周期的(这个在C的时候学过),对于什么是生命周期,用小编的话来说,生命周期就是一个变量从出生到销毁的过程,那么小编这里给读者朋友出一个问题,对于命名空间里的数据,他是属于全局变量还是局部变量?其实它是全局变量,因为命名空间仅仅是对名字进行隔离,除去命名空间这些内容还是在全局中。
3.namespace命名空间是可以进行嵌套的,那么为什么要去嵌套呢?小编这里就举一个例子来说,我们首先先设置一个域定为wang,有一天我和小明在编写项目的时候,我俩同时都想用变量x,并且我俩都不想做出让步,此时我们不能因为这件事打一架吧,此时就可以用嵌套来解决这个问题,下面是代码示意图:
namespace wang
{
namespace wang1
{
int x = 12;
}
namespace ming1
{
int x = 13;
}
}
4.最后说一下一个小的知识点,C嘎嘎的标准库都放到了一个叫做std的命名空间里,我们想要使用一些函数是就需要调用命名空间才能使用,那么如何对命名空间进行使用呢,不要着急,下面进入命名空间环节!
❀2.2.命名空间的使用
2.2.1.域作用限定符 " :: "
我们已经知道了命名空间如何设定,那么我们如何去使用命名空间里面的数据呢?这里就需要用到一个操作符:域作用限定符:"::",它的作用类似于我们在使用结构体数据的时候的 . 操作符,是用来取命名空间里的数据的,下面小编就拿一段代码来让读者朋友知道这个符号的使用:
#include<stdio.h>
int x = 20;
namespace wang
{
int x = 10;
}
int main()
{
int x = 5;
printf("%d", x); //小编之前说过,编译器在查找数据的时候先找局部在找全局,并且小编在之前写C语言的文章说过:在使用同一变量的时候优先使用局部变量
printf("%d", wang::x); // ::的左边放名字,右边放取的内容
printf("%d", ::x); //如果左边为空,则取出的是全局域的内容
}
这个符号具体的使用小编在代码页已经解释清楚了,这里也重复一遍," :: "的左边放置域的名字,如果为空那么就是取出的是全局域的数据,也就是取出的是全局变量 ,这里可能会有一些读者朋友发话了:那么函数局部域的数据是否可以通过域作用限定符来进行取数据呢,很遗憾这是不可以的,这里跟函数局部域的生命周期有关,因为出了函数数据就会被销毁,所以此时我们不可以调用函数局部域的数据,那么使用命名空间的数据只有一种方法吗?当然是不可能的啦 ,小编目前所知命名空间的使用方法有两种,下面小编就开讲第二种方法:
2.2.2.第二种使用方法:用using展开所有成员(不推荐使用)
正如标题所说,小编不怎么会去推荐这个方法来使用命名空间的数据,因为这个风险性很高的,我们先来说说用法,再来讲讲危害,下面用代码来代替文字:
namespace wang
{
int x = 13;
}
using namespace wang;
int main()
{
printf("%d", x); //这里可以直接2使用
}
通过using操作符,我们可以直接使用wang里面的所有数据,这样方便吗?方便。这样风险大吗?很大。我们使用命名空间的目的就是把名字隔离开,如果我们直接使用using,会直接把里面的内容全部展开,此时这里的x就相当于全局域的数据,很有可能再次出现名字冲突的危机,在我们写一些简单的算法题等等可以用它,可是等我们将来写项目的时候,我们如果用这个,真的就是埋了一颗定时炸弹,总有一天这个炸弹会在不经意间爆炸,那时候我们还得因为改数据而变得焦头烂额,所以这个方法能不用就不用,这里可能有些读者朋友会说,如果我们仅仅使用部分成员的话,这些数据常常使用并且不会造成什么危险的话,有办法实现吗?这是肯定的,小编现在讲述的第三种方法就是解决这个问题的,下面进入命名空间使用的第三种方法:
2.2.3.第三种使用办法:using展开部分成员
这个方法算是比第二种方法好,但是远远比不上第一种方法安全,不过有时候也是很方便的,下面小编通过代码来展示一下这个方法的使用:
namespace wang
{
int x = 20;
int add(int a, int b)
{
return a + b;
}
}
using wang::x;
int main()
{
printf("%d", x);
}
这里是仅仅把x = 20展开了,这里也用到了“ :: ”操作符,可以理解为,先让wang把x内容展现出来,我们用using来去使用这个x,正如上文所说,对于一些我们常常使用到的命名空间里的数据,我们可以用这种方法来进行使用,但是安全系数还是不算太高的,所以总结来说,小编还是比较推荐第一种使用方法的,以上就是命名空间的使用方式,下面我们来正式进入C嘎嘎的代码的书写,开始了解C嘎嘎版本的打印和输入函数!
❀3.C嘎嘎的输入 && 输出
在开始正式内容之前,小编先提一嘴,C嘎嘎也是有头文件的,它的头文件是:iostream,是标准输入输出流库,在我们写代码的时候一定要记得它!不然我们就无法使用下面出现的函数,下面进入正式内容:
❀3.1.输出函数——cout
3.1.1.cout函数的概念
我们前面在学习C语言的时候,我们学到的输出函数是printf函数,C嘎嘎可以使用吗,答案是肯定的,C嘎嘎是在C的基础上实现的,自然也可以使用print函数,但我们C嘎嘎也有自己的输出函数,那就是 :cout函数!
cout函数是我们在C嘎嘎常常用来执行输出,也就是打印操作的函数,它的printf更好的功能就是它不再需要%d,%f之类的占位符,它会自动识别变量的数据,这是小编认为优化比较好的功能,那么我们如何使用cout函数呢?别急,上面就是对cout函数的介绍,下面我们进入cout函数的使用环节!
3.2.2.cout函数的使用
这里面就要介绍一下一个不算船新的操作符:"<<",可能一些对于C语言颇有研究的读者朋友会说:这不就是C语言中的左移操作符吗?nonono,在C嘎嘎中,它可以是左移操作符,也可以是流插入运算符,这些都是靠情况而定的,它是搭配着cout进行使用的,在写代码之前,不知读者朋友是否还记得上面所说的std,这是一个标准库的命名空间,我们的cout函数和cin函数就存在里面,我们在使用之前一定要调用标准库,不然我们无法使用cout函数,下面展现一下cout函数到底如何去使用:
#include<iostream>
using namespace std; //这个展开还是要少用,这里小编偷个懒就用了,各位可以用下面这种以后想使用cout,cin函数的时候
//using std::cout;
//using std::cin;
int main()
{
int x = 20;
cout << x; //小编给各位来个形象的比喻:我们可以把cout想成控制台,x是通过<<流向控制台,所以可以实现打印功能
cout << "hello world"; //C是从hello world开始的,C嘎嘎也应该是从这里开始的!
return 0;
}
使用方法小编在上面讲述了,各位可以根据小编用的记忆法来知道cout函数的使用,我们在C阶段的时候,我们有时候需要换行操作,那个时候使用“ \n ”来实现的,那么我们在C嘎嘎也可以使用这个换行符吗?对于部分编译器这个是可以的,不过小编不太推荐使用这个方法,因为有些编译器它是不在接受这个换行符了,那么这个时候我们就又用到了一个函数,那就是endl函数,这个函数是专门来换行的,它的作用是:在流插入输出时,相当于插入了一个换行字符加刷新缓冲区,这是小编复制的一个官方的解释,读者朋友只要记住,它的作用就是换行,下面小编给出代码展示:
#include<iostream>
using namespace std; //这个展开还是要少用,这里小编偷个懒就用了,各位可以用下面这种以后想使用cout,cin函数的时候
//using std::cout;
//using std::cin;
int main()
{
int x = 20;
cout << x << '\n'; //小编给各位来个形象的比喻:我们可以把cout想成控制台,x是通过<<流向控制台,所以可以实现打印功能
cout << "hello world\n"; //C是从hello world开始的,C嘎嘎也应该是从这里开始的!
//上面都是C语言时的换行写法,各位读者朋友少使用,下面的方法才是常使用的
cout << x << endl;
cout << "hello world" << endl;
return 0;
}
我们在C语言的学习过程中对于打印数据的时候,我们可以控制打印几位数,可以控制小数点后面的几位,那么cout函数可以实现这些功能吗?那当然是,不可以的,cout函数虽然方便但有些功能他就是实现不了,这个时候我们只能依靠printf函数来实现了,所以咱并不能说printf函数是一无是处的,它在某些方面还是蛮不错的,下面我们讲述完了输出函数,下面我们讲述输入函数喽!
❀3.2.输入函数——cin
3.2.1.cin函数的概念
此时这里的cin函数就类似我们在C语言阶段学到的scanf函数,就是往控制台输入东西,然后在C阶段的时候我们配合着printf函数来进行在控制台打印数据的,只不过在C嘎嘎阶段我们是配合着cout函数来实现输入输出的,cin函数也比scanf函数好用许多,因为scanf函数我们需要用占位符以及用到变量的地址我们才可以打印数据,在cin函数这通通都不需要,下面小编来给各位讲述一下对于cin函数的使用
3.2.2.cin函数的使用
对于cin函数的使用,这里我还要讲到一个操作符,可能已经有许多的读者朋友已经猜到了,那就是:“>>” 流提取运算符,这个可能也有读者朋友会说了,这不是C语言的右移操作符?确实在C语言是这样的,但现在是C嘎嘎,它也可以是流提取运算符,下面小编通过代码来给各位读者朋友了解cin函数的用法:
#include<iostream>
using namespace std; //这个展开还是要少用,这里小编偷个懒就用了,各位可以用下面这种以后想使用cout,cin函数的时候
using std::cout;
using std::cin;
int main()
{
int x = 0;
cin >> x; //这个可以想成从cin函数里面读取数据到x , 也是一种水的流动
cout << x << endl;
return 0;
}
对于这个cin函数的理解方法,小编在上面的代码说明了,其实它和cout函数我们都可以记成水的流动,只不过方向不同罢了,一个是从数向控制台流动,一个是控制台向数流动,对于cin函数的使用,读者朋友要记住他的用法!看完cin函数和cout函数读者朋友是否感到:
小编在学习的时候也是这么觉得很nice,在本节最后小编提醒一下读者朋友,其实cin,cout函数的对于算法题的运行效率不是太高,如果做到一些相关的算法题,可以加入下面的代码来进行改善。
int main() {
在io需求⽐较⾼的地⽅,如部分⼤量输⼊的竞赛题中,加上以下3⾏代码
可以提⾼C++ IO效率 ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
return 0;
}
❀❀❀ 总结❀❀❀
本来小编还想写多一点内容的,不过感觉文章篇幅有点长了,于是分成了两篇文章来进行书写,今天是小编学习C嘎嘎的第一天,已经对新语言的学习充满了期待,就像我当初学习C语言一样,如果文章有错误,恳请读者朋友在评论区指出,小编会吸取错误并进行改正,那么我们下篇文章见啦!