C++入门知识详解(1)
标签: C++入门知识详解(1) 博客 51CTO博客
2023-07-22 18:24:13 124浏览
一、关于C++
C++和C语言一样,也是一门编程语言。只不过C++是一门在C语言的基础上,对C语言存在的缺陷进行弥补,并且容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。C++是可以兼容C语言的。我们知道它也是一门编程语言,并且是在C语言的基础上做出了诸多优化即可。
二、C++关键字
C++一共63个关键字,其中C语言占32个。而关于C++的关键字学习,会在后续依次出现。例如auto和inline关键字在C++入门知识详解(2)中会涉及。
三、命名空间
1.局部域和全局域
在C语言中,有局部域和全局域,局部域和全局域可以有相同名称的变量名,这是因为,两个变量处于不同的作用域之中(也就是不同的空间),也就是局部域和全局域。但是在访问相同变量时,局部域优先于全局域。如下图
当局部域存在局部变量test,全局域也存在全局变量test时,即使两个变量的变量名相同,也是被允许的,但在实际访问变量时,优先访问的是局部域里的局部变量,其次才是全局域的全局变量。
2.命名空间及相关概念
2.1命名空间的定义
语法:namespace 域名 {}
在命名空间中,可以创建变量,函数,也可以嵌套另一个命名空间。但是命名空间是一个私密的空间,处于该命名空间的所有内容都无法直接被外界访问到。
命名空间就相当于一个保险箱,如果保险箱的主人不给你打开它,你就不能看到保险箱里的东西。如下图
我们创建了一个命名空间 Mon,在该命名空间内存在变量test。在访问test时,却无法访问命名空间内的test变量。
2.2命名空间域
在C++中,命名空间所在的区域被称为命名空间域,每一个命名空间对应一个命名空间域。
在创建命名空间时,namespace 后的名字就是该命名空间的名字,也就是该命名空间的域名,也就是命名空间域。相比于局部域和全局域,命名空间域更加隐秘,因为当我们创建了一个命名空间,该命名空间所对应的命名空间域内的变量或者函数我们是无法直接访问到的,如下图
其实,命名空间域就是命名空间所处的空间,也就是{}内的一切内容
2.3命名空间的展开
语法:using namespace 域名
作用:将原本处于私密空间的命名空间域展现出来,使得命名空间内的所有内容可以被访问到,相当于暴露在全局域,此时命名空间域和全局域存在相同变量时会出错
展开某个变量
语法: using 域名::变量名
作用:仅使对应的变量可以被访问到,相当于将该变量放于全局域。如下图
当将全局变量test注释去掉后会报错,因为命名空间域中的test变量被展开后暴漏到了全局域,同一域不能存在相同变量
2.4局部域,全局域,命名空间域访问规则
默认访问的顺序,局部域大于全局域大于开放的命名空间域,也就是说,如果三个域中存在三个相同名称的变量,会优先访问局部域内的变量,其次才是全局域,最后才是被展开的命名空间域,如果某个域不存在,依旧按照局部域大于全局域大于展开的命名空间域来访问。
2.5命名空间内容的访问
1.将命名空间完全展开
语法:using namespace 域名;
该语句会将命名空间原本私密的空间打开,让它可以被外界访问到。虽然展开的命名空间可以被访问,但是访问的次序依旧是局部域大于全局域大于命名空间域。如下图
三域同在,局部域优先
没有局部域,全局域优先,但是展开的命名空间域相当于暴露在全局域,所以不能存在相同名称的变量,如下图
要想访问到被展开的命名空间域内的变量,只要局部域和全局域中没有相同变量名的就可以访问,如下图
2.使用域作用限定符::
域限定符由两个冒号组成,可以无需将命名空间展开,就能指定访问全局域或者命名空间域
冒号前面是域名,域名就是创建的命名空间的名称,后面是该域内(命名空间所在的空间就是命名空间域)的变量
如果冒号前面什么都没有,后面跟着一个变量,则表示从全局域中访问该变量。如下图,未被展开的命名空间内的变量依旧可以指定访问
3.指定内容展开
仅仅将test变量展开,使其可以被访问,如下图
2.6命名空间的作用
作用:防止自己和库函数的变量名或者函数名或者类名相同引起的冲突以及程序员与程序员变量名相同引起的冲突
如下图,当自己定义的变量名rand和库函数里的rand函数的函数名相同,我们想要输出自己定义的变量时,编译时报错rand重定义
rand函数包含于头文件stdlib.h,不包含该头文件时,不会报错
当定义的rand变量是局部变量时,也没有报错。这是因为包含的头文件的内容,相当于是在全局域之中(和命名空间的展开类似),默认的访问顺序,局部域大于全局域,所以当访问到局部域的rand变量时,就不会去全局域搜索,因此不会出错。如下图
3.关于命名空间(重要)
命名空间就是一个封闭的空间,当创建出一个命名空间时,该空间的内容是无法被访问到的,而命名空间的展开,即语句using namespaace 域名,其实并不是像C语言编辑器预处理阶段那样,将头文件所包含的内容全部展开(添加进来),命名空间的展开,是将原本封闭的空间展开,或者说暴漏出来,暴漏在全局域之下,使得该命名空间可以被访问的到。
也就是说,命名空间的展开只是决定了编译器会不会去命名空间当中去访问。
命名空间是C++对C语言中存在的命名冲突问题的解决方法,弥补了C语言的这一不足。
四、C++输入和输出
1.C语言标准库和C++标准库
在C语言中,我们经常会使用到各种各样的头文件,例如#incldue<stdio.h>,#include<assert.h>,不同的头文件里包含着不同的函数定义或者类型定义等等,而每个头文件都是构成C语言标准库的一部分。当我们需要某一函数的功能时,如果它在某个头文件当中被定义过,就可以直接包含头文件然后直接使用,无需我们自己写。
而对于C++,C++使用命名空间解决了C语言命名冲突的问题。
关于C++标准库,它包含了C语言标准库的所有内容。C语言标准库不是由多个不同功能的头文件构成嘛,C++将C语言所有的头文件的内容都放到一个命名空间当中。并且,为了与C语言做区分,C++使用了新的头文件名称,并且舍弃了.h的写法。
也就是说,C++标准库,其实就是一个命名空间,它的域名为std。它不仅包含了C语言标准库的内容,还有属于自己的更多内容。
2.#include<stdio.h>与#include<iostream>
C++是兼容C语言的,所以在C++中依旧可以使用scanf和printf语句来进行输入和输出。
在C语言中,输入和输出分别由scanf和printf语句完成,但想使用这俩个语句,得先包含头文件stdio.h。其实这是因为scanf和printf是两个包含在stdio.h当中的两个函数。如下图
而C++本身也有自己的输入和输出函数,cin和cout。
同样的,cin和cout其实是C++输入输出流库函数iostream里的函数,
也就是说,#incldue<stdio.h>和#include<iostream>一个是C语言标准库的构成的一部分,一个是C++标准库构成的一部分,他们负责的是关于输入输出内容。
只不过对于C语言的输入输入而言,只需要包含对应的输入输出头文件,就可以使用输入和输出语句。但是C++不同,因为C++标准库都位于命名空间中,想要编译器访问的到命名空间里的内容,就得将整个命名空间展开或者展开我们需要的那一部分,使得编译器可以访问的到。
C++兼容C语言,所以可以使用C语言的方法输入输出。如下图
不展开C++标准库std时,即使包含了C++输入输出的头文件也无法使用,因为所以内容都在C++标准库当中,不展开它,访问不到它里面的内容。展开后,即可使用。如下图
3.关于输入和输出
使用C语言的scanf和printf语句时,需要规范数据类型,即用%d,%f来对应输入或者输出数据的类型。如下图
但是C++的cin和cout语句并不需要,如下图
不过,C语言控制输出数据的格式的方法比较简单,而C++的方法比较复杂。因为C++是兼容C语言的,使用在写C语言代码时,哪一种写法更加好用,我们使用即可。
五、缺省参数
1.什么是缺省参数
给函数参数设置默认的初始值,被初始化的函数参数就是缺省参数。
在调用函数时,如果不传递参数,那么就默认参数值为设置的默认初始值,如果传递参数,则按传递的参数值为主。如下图
2.缺省参数的分类
缺省参分为全缺省和半缺省
全缺省就是该函数的所有参数都是缺省参数,也即所有函数参数被设置了默认初始值。如下图
而半缺省则是既有缺省参数,也有普通参数。如果要设置某一函数的参数为半缺省,那么缺省参数必须是从右到左设置,并且缺省参数必须是连续的。如下图
从右到左设置缺省参数的意思就是,如果你要设置缺省参数,那么最后一个,也就是最右边的参数必须是缺省参数,否则就会报错。如下图
如果缺省参数没有连续,同样也会报错。如下图
3.缺少参数的使用
在调用有缺省参数的函数时,传递的参数从左到右依次对应函数从左到右的参数,也就是说,传递的参数和函数本身的参数顺序是一致的。
如下图,ret1接收的Sum1返回值只传递了一个参数,并且是传给了x,后两个是缺省参数,所以可以不传,也可以传。
如果函数参数是全缺省,那么函数参数可传可不传,也可以只传一部分。如下图
如果函数参数是半缺省,那么缺省参数可以不传也可以传,但是非缺省参数必须传,同时牢记传参的顺序与函数参数的顺序是一致的。如下图
4.关于缺省参数
缺省参数的默认初始值,其实也就是缺省值,必须是常量或者是全局变量,和缺省值必须从右到左给,以及缺省参数必须连续一样,这些都是创造缺省参数的人的规定,想使用只能遵循。此外缺省参数不能在函数声明和定义中同时出现,这也是规定,是为了防止声明和定义中的缺省值不同,导致编译器无法判断使用哪一个。并且在C语言中并不支持缺省参数。
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论