C++的初步了解与认识(上)

目录

C++的初步了解(上)

1.C++历史

2.了解C到C++新增了什么以及一些术语

(1).C++到C的新增

(2).C++里的特性与专业术语

3.C++关键字(C++98)

4.命名空间

4.1了解命名空间

4.2 命名空间定义

4.3命名空间的使用

5.C++的输入输出

6.缺省参数

6.1缺省参数的概念

6.2缺省参数的分类

6.2.1全缺省参数

6.2.2半(部分)缺省参数


C++的初步了解(上)


1.C++历史

1982年,Bjarne Stroustrup博士(后续咱就称这位是我们的祖师爷)在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。

网上很多人说c++是最难学习的语言之一,我觉得不是那样,因为在我们学这门语言的时候所达到的最高度只需要正确高效的学出程序代码即可(不要大家像我下方的图一样了,大家都很厉害啦),少数人能深入的解读c++这门语言我相信这些都是隐藏的大佬,在一个最高只有极少数人能够达到这最后一层,因为这最后一层完全就可以探讨c++的本质了,举例:c++标准委员会的都是这个层次,还有我们大名鼎鼎的侯捷老师。相信大家已经不言而喻了吧。

说了这么多也就是让大家不要害怕,不要开始就带着它很难,我是不是学不会,什么什么的这种心情,其实c++也挺好玩的,看看我们祖师爷都把c的一些问题解决了,我们用着也很便捷,我也和大家一样也是才开始学,我们一起进步吖!!!!!

2.了解C到C++新增了什么以及一些术语

(1).C++到C的新增

①.新增了命名空间 ​

②.新增了异常处理 ​

③.新增了面向对象编程 ​

④.新增了变量的权限 ​

⑤.新增了变量的引用 ​

⑥.新增了函数重载及运算符重载

(2).C++里的特性与专业术语

①.类与对象 ​

②.继承 ​

③.多态 ​

④.封装 ​

⑤.组合 ​

⑥.静态绑定 ​

⑦.动态绑定 ​

⑧.特征

​⑨.行为

然后除了这些东西C++的程序编译也有4个,包含了很多底层的东西。

①.预处理 ②.编译 ③.汇编 ④.链接

[1]  (小知识:c++也是兼容c语言的) 接下来我们进入正题的开展!!!


3.C++关键字(C++98)

首先学习一门语言还是要先了解它的关键字,所以如下表格:

asmdoifreturntrycontinue
autodoubleinlineshorttypedeffor
booldynamic_castintsignedtypeidpublic
breakelselongsizeoftypenamethrow
caseenummutablestaticunionwchar_t
catchexplicitnamespacestatic_castunsigneddefault
charexportnewstructusingfriend
classexternoperatorswitchwirtualregister
constfalseprivatetemplatevoidture
const_castfloatprotectedthisvolatilewhile
deletegotoreinterpret_cast

4.命名空间

4.1了解命名空间

命名空间就是祖师爷为了改善重名而设计出来的,而使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

看图!!!

C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决(注意.c后缀和.cpp后缀,因为俩者的编辑器不同1) 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”

看图(C++)!!!

其实C++跟C语言有很多很多相似的地方,就比如框架,也就多了using namespace std;cout << "hehe" << endl;然而这俩恰好>就是C++的核心内容,cout << "hehe" << endl;这一句主要实现的是C语言的printf函数因为涉及到对象问题不详细说明。接下来的我多用的是C语言中的printf来代替。

通过这俩个图大家应该深有感触,这个命名空间的好处!!!

4.2 命名空间定义

定义命名空间,需要使用到namespace**关键字,后面跟命名空间的名字,然后接一对{}即可,

{}中即为命名空间的成员。这就是一个基本的架构,如下:

 namespace aaa
 {
     ........;
 }

既然知道了框架,那么这个里面填什么就简单了,其实在命名空间里什么都可以定义,例如:变量/函数/类型 如下演示:

 //test.cpp
 namespace aver
 {
  int a = 10;
  int Add(int x, int y)
  {
      return x + y;
  }
  struct sc
  {
     struct sc* next;
     int ben;
  };
     namespace  aaa
     {
         int x = 0;
     }
 }
 //这里面就有函数,还有变量,还有我们的结构体

既然里面什么都可以定义,假如我再在里面定义一个命名空间可以吗?答案当然是可以的,这就相当于循环的嵌套一样可以使用,不过很多时间都不嵌套,最多也是只嵌套一个命名空间,大家还是老老实实的就用一个命名空间也挺好的,实在要多的就在重新定义一个也可以。我也在如上也添加了嵌套的形式。

如果大家遇见俩个相同的命名空间了它们会怎样,这算是我上面没有提到的一个漏洞,那么我来解释一下:

 //test.h
 namespace aver
 {
  int c = 10;
  int Add(int m, int n)
  {
      return m + n;
  }
 }

假如我们那个aver命名空间是在test.cpp文件下,而我现在这个是test.h文件,那么这俩个同名的命名空间就会合并成一个命名空间 所以我们在C++中可以出现多个同名的最后都会合并。

4.3命名空间的使用

既然我们都会定义命名空间了,那么该如何使用呢?,如下:

如果我们直接访问就会出现上图的错误,所以我们就要用我们的域作用限定符来解决问题,如上图中我的注释,就是俩给冒号,但是不要忘记是英文的符号,这俩个组合到一起就是我们的域作用限定符,其实用法就跟C语言中的结构体相似,不多说看图!!

这就是访问命名空间的步骤以及方法, (那么访问结构体大家猜一下是把域作用限定符加在哪里,假如我给定是struct sc xxx,是在struct前面,还是在sc前面,大家就思考一下,我留下这个问题交给大家,后续可以私信或者评论问我), 这只是最普通的方法,其实还有俩种各有优缺点。

第一种:局部引入(授权)

如下:

这个方法就用到了我们的using这个关键字,其实这个关键字在后续还有很多用法,大家感兴趣可以去搜索一下,在我们这里就是起到一个引用的作用,我引用了这个命名空间里的什么东西就是这个意思,然后这就解释通了,我们这就是引用了aver中的b变量让它开放出来了,那么在下面我们就可以访问到。

第二种:全局引入(授权):

如下:

如果我们这样操作的话我们就要就注意!注意!再注意!因为全展开了,就是相当于任何人都可以访问到你,这样就又会出现重名的问题,所以一般还是就用我开始讲的那种访问,出现问题较少,如aver::a这样单个引入,能避免一些不必要的问题。如果有人眼尖会发现我先前提出了using namespace std这句话,这就是我们C++的标准库的命名空间,我们C++的东西都在里面,我们全展开确实有为危险,针对项目而言的,但是对于我们初学者和日常使用者来说我们就这样展开就行,因为也不会遇见冲突的问题,然后依据我上面所讲的应该就可以理解using namespace std这句代码的意思了。

那我们来总结一下这小节,其实命名空间的使用无非就是我上述的三种方法,单个引入访问就是用域作用操作符直接访问成员 ,局部引入(授权)相当与门禁卡把你信息录进去了,你可以开对应的教室,但是你去别的教室就不行,全局引入(授权)就是把你的信息上升到管理层,可以随便开各个地方的门禁,这样危险就会随即来临。


5.C++的输入输出

再这里我们只讲如何使用和一些注意事项,不涉及它具体的底层逻辑!有了上述的基础现看一段代码

 #include <iostream>
 using namespace std;
 int main()
 {
    int a;
    double b;
    char c;
    // 可以自动识别变量的类型
    cin>>a;
    cin>>b>>c;
      
    cout<<a<<endl;
    cout<<b<<" "<<c<<endl;
    return 0;
 }

说明:

1.使用cout标准输出对象(控制台)cin标准输入对象(键盘)时,必须包含< iostream >头文件 以及按命名空间使用方法使用std

2.coutcin是全局的流对象,endl是特殊的C++符号,也可用C语言中的”\n“,表示换行输出,他们都包含在包含 < iostream >头文件中。

3.<<是流插入运算符,>>是流提取运算符。

4.使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。 C++的输入输出可以自动识别变量类型。

5.实际上coutcin分别是iostreamistream类型的对象,>><<也涉及运算符重载等知识, 这些知识我们我们后续才会学,所以我们这里只是简单学习它们的使用。

补充:1.(关于cout和cin还有很多更复杂的用法,比如控制浮点数输出精度,控制整形输出进制格式等

等。因为C++兼容C语言的用法,这些又用得不是很多,大家有兴趣可以自行了解) 2.如果不理解这个说法的,我自己的一些见解就是相当于有一条支流是通向大海的,<<这个流输入就表示小河流向大海的方向,这个<<符号后面的东西都是流进去的,所以都会再大海中看见,便是流输入。 cin是流输出,既然是输出,我们就可以理解为大坝放水,大坝>>(开闸放水)到大海,就是这个过程,只不过我们变成了键盘输入到控制台。


6.缺省参数

6.1缺省参数的概念

其实这个很容易理解跟你们讲个笑话再结合我下图的代码大家就知道了,就是说咱们的添狗里忽然收到女神的消息让他帮忙去做什么,那指定开心完了,就帮女神哐呲哐呲做完了,然后女神后面没有找他了,本想着跟女神去一起吃个饭看个电影的,女神一直没回,但是看见女神跟一个高富帅吃饭逛街看电影,你就默默的走开了,但是隔天你又收到了女神的消息说来帮我提东西。。。。。此处省略一万字。 大家再结合代码看一下,是不是我们的缺省参数a就是添狗,那个第二个函数传参传的520是高富帅了。函数就是我们的女神。

6.2缺省参数的分类
6.2.1全缺省参数

全缺省参数就是相当与就相当于是渣男渣女了,一下子几个,现在我们这里就是三个,(想想都可怕)

其实大家应该发现了,这里既可以跟原来的函数一样用传相应的值,也可以传一个,或者没有,只能加了语法的灵活性,祖师爷还是厉害啊,我不知道大家有没有这个想发我可不可以只传第二个或者第三个,但是我在这班答案告诉大家,显然是不能的,祖师爷在创造这个语法的时候就没规定这个,所以我们就老老实实用就行,这个传参传的值显示都是从左往右显示传参的大家记住哦

6.2.2半(部分)缺省参数

半缺省,也叫部分缺省,在传参的时候你至少要传一个,因为至少有一个不是缺省变量。毕竟至少你的正牌男(女)友一直需要你,但是你偷偷找别人添狗那就没办法了。如下图:

注意:

1.半缺省参数必须从右往左依次来给出,不能间隔着给。(例如:你不能中间是形参,俩边是缺省参数,这样的话你就会报错,因为语法定义大家要注意)

2.缺省参数不能在函数声明和定义中同时出现。在项目里面都是在声明里面给而定义是不给的(7字真言:声明给,定义不给

3.缺省值必须是常量或者全局变量。

4.C语言不支持(编译器不支持)。

小结一下吧!

如果你是有c语言基础并且接触过数据结构,我接下来说的一定会让你知道缺省参数的好用,如果你没学过请直接跳过

就是在栈的设计就很香,假如是一个顺序表,用以前的C语言的写法要初始化就会开空间,也可以不开,但是就会有问题,这里不谈这个初始化为空的问题,那我们接下来是要扩容,因为要什么头插啊,尾插啊,那么我们怎么避开这个扩容消耗哩,有人就会说用宏定义#define ,但是在很多场景下是不好的,难道要你一直改变宏定义的量,来达到你的要求吗,不行的! 这个时候我们在初始化的地方套一个缺省参数就很好用,这就解决了前面的问题,让代码更为灵活。相信大家结合上面的就能看懂这里的长篇大论!!!


在下卷我们会一起学习更多的基础入门知识,内容会比上卷多一点,希望大家耐心等待,也更希望我的这些能够帮助到大家,其实我们都是普通人,让我们为了自己的目标、抱负,展开这C++的学习之旅。

如果您觉得有什么不对的,没有说清楚的,种种问题欢迎评论区留言或者私信!!!!!!!!

本章完!!

  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值