> 文档中心 > C++基础入门篇——入得三寸天地,匀开理想三旬

C++基础入门篇——入得三寸天地,匀开理想三旬

目录

    • 传统艺能😎
    • 前言😎
    • 选择😎
    • 嘛是C++😎
    • 命名空间🤔
    • 域作用限定符🤔
    • C++输入与输出🤔
    • 缺省参数🤔
    • 函数重载🤔

传统艺能😎

小编是双非本科大一菜鸟不赘述,欢迎大佬指点江山(QQ:1319365055)
此前博客点我!点我!请搜索博主 【知晓天空之蓝】
乔乔的gitee代码库(打灰人 )欢迎访问,点我!

🎉🎉非科班转码社区诚邀您入驻🎉🎉
小伙伴们,打码路上一路向北,背后烟火,彼岸之前皆是疾苦
一个人的单打独斗不如一群人的砥砺前行
这是我和梦想合伙人组建的社区,诚邀各位有志之士的加入!!
社区用户好文均加精(“标兵”文章字数2000+加精,“达人”文章字数1500+加精)
直达: 社区链接点我

🎉🎉🎉倾力打造转码社区微信公众号,等你加入!🎉🎉🎉


在这里插入图片描述

前言😎

没错,当你看到这里的时候说明我们C语言部分已经完结辣,初级的数据结构基础已经拿捏,我将步入C++的净土。

在这里插入图片描述

你可能会说:啊这,不是上一篇才八大排序,算法还没搞完就跳到C++了?是什么让我做出这么跳跃的决定

首先算法本来就是代码的思想素养,他应该在积累中绽放身姿,本来我想放在最后期来学习和讲解,现在写出来单纯是因为觉得现在咱有能力拿捏他,何尝不去细节的拿捏一波呢?所以这和本来我计划的学习大纲并不冲突捏~
在这里插入图片描述

选择😎

至于我为什么会选中去深入学习 C++ 也是有原因的,并非脑子发热一时兴起之举。

在学习C语言之初就为未来学习方向打听了解了很多,很长时间后我才决定将我的目光投向 C++ 或者 JAVA,二者对于我这个又菜又爱玩的萌新来说无疑都极具吸引力,但是鱼和熊掌不可兼得,专精才是真爱,海王最后注定一无所有,摒着这个思想我狠狠去各大网站平台,某乎,pilipili,CSDN,甚至浏览器上各种不知名散装帖子。我承认,各抒己见,我被灌输了很多不同的意见和观点,导致我对于选择更加焦灼与懵b。

因此我转身去了解了一手前端和后端,从本身去了解 c++ 和 扎瓦,两者学习难度是一样的,憋听世面上说什么扎瓦简单易学,从来没有一门语言是简单易学的,简单易学的语言只适合小型玩具程序,而且从目前Java庞大的类库看来,简单易学好像根本没有了;最后综合了心态,环境和个人兴趣还是把镖扔向了C++

嘛是C++😎

C++和C一样吗?跟卡巴斯基和巴基斯坦一样,有个基巴关系,但也不是完全没关系,C++里面好歹带了个C,就不难知道他和 C 语言还多少有点渊源。
在这里插入图片描述

C语言是模块化和结构化的语言,只适合处理规模小的程序,对于复杂的大规模程序,C语言需要高度的建模与抽象,就显得尤为吃力与不适,为了解决这个尴尬,80年代提出了OOP,即 面向对象编程,C++,因此横空出世。

(搬个老图,面对对象实在太草了)

在这里插入图片描述

这是在C语言基础上引入并扩充了面向对象概念,为了表达和C语言的渊源,就命名为了C++(最早是贝尔实验室命名为 C with classes,即加入了类的概念)。

某度对面向对象的定义是这样的:

面向对象程序设计(Object Oriented Programming,OOP)是一种计算机编程架构。. OOP的一条基本原则是计算机程序由单个能够起到子程序作用的单元或对象组合而成。. OOP达到了软件工程的三个主要目标:重用性、灵活性和扩展性。. OOP=对象+类+继承+多态+消息,其中核心概念是类和对象

在这里插入图片描述

不慌,我们慢慢来

命名空间🤔

但凡有看过C++的铁汁都会注意到,C++里面有个头文件是

 #include 

他就相当于我们C语言里面的,他是在控制台对 IO 流进行输入输出操作的,接着你会看到一个

using namespace std;

为了调用带有命名空间的函数或变量,需要在前面加上命名空间的名称。using 就是引用,他在引用一个命名空间 namespace,我们这里又会牵扯到一个命名冲突问题,即同一个域里面,不能有同名变量,C语言没有很好的解决这个问题,而CPP正好帮他擦了屁股

像C语言里面二级指针啥的太绕了,因此C++就产生了引用这个概念,本质上就是在对C语言的一个补充作用,所以C++基础语法也是无时无刻在为C语言补坑。要知道我们定义一个变量要注意两点,一就是要符合命名规则,二就是不能和关键字重名,比如定义了一个叫 number 的同时再定义一个叫 number 的函数或者定义一个 number() 函数,但在另一个可用的库中也存在一个相同的函数 number()。这样,编译器就无法判断您所使用的是哪一个 number() 函数

但是引用了命名空间就不一样了,这个空间仿佛一片净土给予他逍遥法外的机会,就是这么个原理。
在这里插入图片描述

域作用限定符🤔

我们在程序里定义了两个同名变量 a,一个是全局变量一个是局部变量,那么我能在 main 函数里面 printf 一下全局变量 a 的值吗?答案是可以的!我们写作如下:

int a = 0;int main(){int a = 1;printf("%d\n",a);//打印局部变量 1printf("%d\n",::a);//打印全局变量 0}

那么问题来了,这个 ::到底何方神圣?他就是域作用限定符,双冒号左边是空白,我们就默认它是全局变量的 a 。

所以就可以知道命名空间是如何解决命名冲突问题的,如下是一个命名空间域,他和结构体不一样啊,他的作用是让里面的成员和外界成员形成一个隔离,需要访问域内成员就可以单独访问,避免冲突。

namespace room//命名空间域{int a = 0;//全局变量名int rand = 0;//stdlib库变量名}
printf("%d\n",room::a);printf("%d\n",room::rand);//域内成员访问

注意如果多文件下定义了重名的命名空间,它是可以同时存在的,语法会默认将同名的命名空间进行合并。但是命名空间里面如果有重名的变量就会发生冲突,同样的道理我们可以借助命名空间的嵌套解决,再加一层命名空间即可,注意命名空间套个两三层就绝对的多了不可多套。

我们要用命名空间里的对象时,直接啪一句即可

 using namespace xxx;//把xxx这个命名空间定义的东西放出来

就好像一个声明告诉你现在隔离层拆了,freedom!变得和全局变量差不多;我们甚至还能继续向里展开,比如 room 里的变量 a ,我们命名空间不能完全展完,展完就没有意义辣!严格来说不能随便去展开。
在这里插入图片描述

所以我们常见的一句声明: using namespace std;

这里 std 就是对C++库的封装,当然不写这句话也行,实际应用就需要域作用限定符去指定域名。我们放出来虽然方便使用,但是存在冲突风险,比如定义一个全局变量 cout 后使用 cout<<cout<<endl。为了解决冲突与方便问题,我们提出了第三种方式,非全展开,我们展开常用的就行:

using std::cout;

C++输入与输出🤔

C语言输入输出需要我们指定类型的 scanf 与 printf ,C++里面又不一样了,我们对应使用的是流提取运算符 >> 和流插入运算符 <<

cin >> a;cout << a;

这个在C++里面叫运算符重载,cin 和 cout 叫对象,属于类和对象的知识,暂只做了解。

他相比C语言的改进就非常奈斯了,因为输入输出可以多组输入输出,不用指定数据类型且可以交错类型,比如:

int a;float b;cin >> a >> b;cout << a << b << endl;//endl相当于一个换行关键字,等价于‘\n’

但是C++想控制浮点数的位数输出就很麻烦了,想了解的情自行上网查询,但是极其不推荐,因为你会了也记不住,而且别忘了C++兼容C语言,直接C语言多方便啊是吧,所以要控制格式推荐C语言实现。
在这里插入图片描述

缺省参数🤔

C++引入了一个新的概念叫缺省参数,也叫默认参数,这是C语言没有的语法,指调用函数没有传参时,会使用参数的默认值,就好像你若安好,备胎到老。

那如果对应是多个输入呢?是不是需要多个缺省参数,备胎成堆那不是更渣吗?

void func(int a = 1,int b = 2,int c= 3){cout << "a= " << a << endl;cout << "b= " << b << endl;cout << "c= " << c << endl;}int main(){func();func(10);func(10,20);func(10,20,30);return 0;}

结果如下:
在这里插入图片描述

我们这里是给所有参数都给出了默认值,我们称之为全缺省,有全必有不全,我们的半缺省就横空出世了,半缺省还有一些细节需要注意,他必须是从右往左缺省并且是连续的

全缺省和半缺省的选择视情况而定,在某些情景里面半缺省也是很奈斯的,比如我们的栈。

struct Stack{int* a;int size;int capacity;};void StackInit(struct Stack* p,int n = 4){assert(p);p->a =(int*) malloc(sizeof(int)*n);p->size = 0;p->capacity = n;}int main(){Stack st;StackInit(&st,100);//初始容量和扩容参数上比较方便}

函数重载🤔

又来补坑辣,C语言不支持同名函数,但是C++支持。

要求就是参数名相同而参数不同,比如个数,类型等等。我们需要知道函数重载到底有什么意义,C语言为什么不支持?比如我实现 swap 函数来交换两数的值,分别交换一组整型和一组浮点数,两组数类型不同因此需要两个 swap 函数,是不是想到就很不爽。

所以C++支持同名。,看起来是一个函数但实际是相互独立的,后期的模板就能把这个玩通透。

今天就到这里吧,摸了家人们。