hello大家好,久未更新,最近我也不知道我在瞎忙一些什么。从今天开始,打点行装,重新“做人”,继续更新我的博客,欢迎大家继续支持。
那么从今天开始,我们来陆续写一下关于C++的文章,我也是C++的初学者,欢迎大家一起交流,让我们互相学习,共同进步。
首先,让我们先来了解一下C++。就像是认识一个人一样,我们可以从一个人的名字里推测出这个人的一些信息,那么从C++的名字里,我们也可以看出,它和C语言有着密不可分的关系。事实也是如此,C++是在C语言的基础上发展而来。二者有着很深的渊源,可以说C++在某种程度上是C语言的孩子,并且还把前浪拍在了沙滩上。在这篇文章中,我们将从C++与C的区别和联系的角度入手,来谈谈C++与C语言不得不说的那些事。
C++是一门面向对象的语言,C语言则是面向过程的语言。
那么什么叫面向对象,什么又叫面向过程呢?
面向过程注重分析解决问题的步骤,将步骤依次实现再调用。
面向对象则把事物抽象成对象的概念,赋给对象一些属性和方法,让对象去执行自己的方法,从而解决问题。
以做菜为例:
面向过程需要我们完成如下几步:
面向对象我们则需要这样来完成:
这是一个比较形象的例子来对二者的优缺点进行说明。
炒饭菜和饭混合,吃起来你只有我,我中有你,十分入味。但是如果你不爱吃其中的某种青菜的话,这种你只有我我中有你反而成了一种苦恼,那就只能浪费这一份炒饭重新做一份不含这种青菜的了炒饭喽。
而盖浇饭则不然,盖浇饭菜与饭是分开的,做到了“仿佛永远分离,却又终生相依”。如果你不爱吃其中的某种青菜,很容易就可以将它挑出来。
我们说炒饭无法这种你只有我我中有你换成专业一点的说法是可维护性差,而盖浇饭则可维护性好。但是盖浇饭并没有炒饭入味,也就是说炒饭性能更好,而盖浇饭性能差一些。
《小王子》中说“想要变成蝴蝶,必须要忍受两三条毛毛虫”任何一个尽力达到完美的事物都有着其不可避免的缺点,无论是面向过程还是面向对象,他们的有点很清晰,缺点也很清晰,扬长避短,才能做出我们想要的“饭”。
从上面的一些介绍中我们可以看出,面向过程和面向对象的思维是两种不同的思维。面向过程似乎更加按部就班一些,一步步地去解决问题,是埋头苦干类型的。而面向对象更加灵活,更加抽象,更加讲究模块化、计算机逻辑化。
我们发现,当我们开始着手写一个C++的程序的时候,文件的后缀不再是C语言中的.c而是变成了 .cpp。文件后缀的改变表明了C++脱离C语言独自开创一番天地的决心,但是它似乎并没有独立的那么彻底,C++是兼容C语言的语法的,我们来看这样一个例子:
虽然C++兼容C语言的语法,但是它一定不会与前辈完全相同,那么它有哪些不同呢?我们往下看:
#include
using namespace std;
int main()
{
cout << "hello,world" << endl;
return 0;
}
这是我们用C++写出的一个非常简单的代码。我们观察这段代码,会发现这里面出现了许多陌生的东西。我们把这段代码和上面C语言风格的代码对比
我们就可以发现,在C++中,多了一个namespace,输出则用cout输入输出库则变成了iostream。但是我们可以发现,虽然有不同,但是总体书写风格却是那么的相近,这也说明了C++和C语言的亲近关系。
下面我们就来介绍一下namespace也就是命名空间。
我们发现这个程序是报错的,报错如下:
为什么会出现这样的情况呢?我们来分析一下:
在C语言的库里,有scanf函数,我们想把scanf设为一个变量,又想调用库里的scanf函数。这两个名称一致,编译器会傻傻分不清,所以报错。
那么我们怎么来解决这个冲突呢?
==我们在C++中引入了命名空间,来进行名字的“隔离”==具体怎么操作呢?我们继续往下看:
我们在什么的程序中定义了一个命名空间,所有冲突迎刃而解。你或许已经感受到它的神奇,那么命名空间又该如何定义呢?
并且我们要注意,命名空间是可以嵌套定义的,并且可以嵌套多个
也就是说,我们可以有这样的代码出现:
namespace my_name
{
int a;
namespace my_name1
{
int b;
namespace my_name2
{
int c;
}
}
}
我们先来说明作用域限制符“::”
在命名空间中::用来注明所使用的类、函数属于哪一个命名空间
那么,我们当回过头来看我们之前的代码,我们会发现红色圈起来的部分:
这个std又是什么呢?
其实是这样:C++库为了防止命名冲突,把自己库里的东西都定义在一个std的命名空间里,也就是说,std本质上是一个命名空间的名字。当要使用标准库里的东西,我们又有三种方式:
1.指定命名空间
这种写法是最规范的,但是每一个地方都要指定,所以很麻烦。
2.借using namespace展开std
这种方法看起来很轻便,它相当于把std库展开,把库里面的东西都放在全局域。我们写比较简单的程序经常使用。但是如果我们自己定义的名称和库冲突的时候,这种看似轻便的写法便无能为力了,所以若想规范书写,这种做法是不推荐的。
3.折中方案:部分展开
我们可以通过上述方式,只对部分库里的展开,这种方法更加可以满足我们的多种需求,在项目中更经常使用。
通过上述对std的举例,我们也可以总结出
命名空间的三种使用方法:
int main()
{
printf("%d",N::a);
return 0;
}
该种做法最为规范但也最为麻烦
using namespce N;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
Add(10, 20);
return 0;
}
该种写法最为省力但是极其不规范
using N::b;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
return 0;
}
该种写法是前两种写法的折中,推荐使用.
好的,命名空间我们就先介绍到这里,我们接着往下看C++的输入与输出。
C++的输入与输出并没有延续C语言的scanf和printf。而是用cin和cout。
关于cin和cout的详细介绍,我们将在后续的博文中推出,这里先不做过于详细的介绍。不过我仍要强烈安利的一点是,cin和cout可以自动识别类型,这比C语言使用起来方便地多。
没有对比就没有办法验证期待,我们来对比一下:
#include
using namespace std;
int main()
{
int a;
int b;
printf("请输入a的值\n");
scanf("%d", &a);
printf("%d\n", a);
cout << "请输入b的值" << endl;
cin >> b;
cout << b<<"\n";
return 0;
}
好了,我们今天的博文就到这里了,后续我会继续分享,请大家监督我,不要让我偷懒(好吧,我承认,我最近确实很懒)。在上面的文章中,我们围绕C++分享了面向对象与面向过程,命名空间等知识点,也许不够全面,不够细致,甚至还存在瑕疵,希望大家包容。也欢迎大家一起交流,共同进步。儿童节刚过不久,分享一首姜二嫚小朋友的诗,祝我们心里永远住着一个小朋友:
晚上
我打着手电筒散步
累了就拿它当拐杖
我拄着一束光