C++基础篇章
一、命名空间
1、解决c语言中的访问冲突问题
在C语言中,有一个函数叫做rand,它可以生成一个随机数,这个函数在stdlib.h这个头文件中,要是我们定义一个不在main中的变量也叫做rand,那编译器就会报错说重定义,因为此时的编译器分不清楚这个rand是变量还是函数。
而在C++中为了解决这一问题,就有了命名空间,关键字为namespace,而在这个自定义的命名空间里面我们可以定义出一个整型的rand,这个时候编译器是不会报错的
因为rand的作用域是不一样的,不会引发冲突。
用法: namespace +命名空间名字{}
namespace test
{
......
}
2、命名空间的使用与嵌套
先引入一个命名空间例子:
namespace test
{
int a=10;
int add(int x,int y)
{
return x+y;
}
}
命名空间使用的方法有三种如下:
第一种:使用空间访问限定符::,比如在一个名为test的命名空间中,要使用其中的变量a或函数add,就可以这样使用:test::a
第二种:使用using关键字引入,引入命名空间中的变量,同样以test命名空间为例:using test::a
第三种:使用using namespace,引入整个命名空间到此程序文件中,这种使用请款相当于,把整个命名空间中的所有内容放开了,随时都可以访问其中的内容。
如果在一个工程中有两个同名的命名空间,两个同名的命名空间就会融合到一起;在命名空间这个机制中,命名空间其实是可以嵌套的,而嵌套后的命名空间使用的方式也是有区别的,在上述的使用方法中也是有所不同的,好比如如下的一个嵌套:
namespace test
{
int a = 11;
namespace test1
{
int b = 20;
}
}
假设要访问b这个变量,我们可以使用空间访问限定符来访问:test::test1::b,这样我们就可以访问到b,这个原理就好像剥洋葱一样一次层一层的进入到内部。
3、命名空间的总结
命名空间,就是为了解决在 C语言中,无法分辨出当在定义一个与关键字相同的变量的时候编译器无法方便此变量的一种机制,一个命名空间就是给出了一个作用域,并且命名空间中的内容都是受限制与这个命名空间的。补充:在C++中有四种作用域:函数作用域,类作用域,命名空间作用域,局部作用域
二、缺省参数
1、概念
在调用函数时,在给函数的形参的那个值就是缺省参数,当在给形参传参的时候,要是给定了缺省值那么就会使用给定的缺省值,要是没有给那就会直接用形参的默认值
2、全缺省和半缺省
在缺省参数中,分为全缺省参数和半缺省参数,全缺省参数就没有什么要注意的,半缺省参数需要注意一个地方就是,在赋值的时候需要注意,从右往左赋值,不可以间隔着给
从右往左给:
三、C++的输入和输出
1、C和C++在输入输出的区别
在c语言中输入和输出大多数都依赖于scanf和printf,换行则是靠转义字符/n,不仅仅是这也,而且当要输出一个变量的时候还要去选择这个变量的类型,所以对于操作上来说会比较繁琐!但是C++的输入输出,则靠的是cin和cout,换行靠的是endl这个关键字,而且C++会自动识别变量的类型,且包含的头文件也是不一样的,C则需要#include<stdio.h>,C++则需要包含#include,对于输入输出这个层面后者是兼容前者的
2、输入、输出的使用
当然在使用这些东西的时候,依然是需要包含头文件的,#include,而且cin和cout、endl是在std这个命名空间里面的,还需要了解两个符号:就是输入流符号>>以及输出流符号<<以及展开这个命名空间using namespace std;因为C++的标准库的实现方法都在这个std命名空间中,这样就可以正常使用了。
四、函数重载
1、函数重载的概念
在C语言中,如果有两个同名的函数实惠报错的,而这一现象在C++是不会存在的,因为C++是支持函数重载的,函数重载就是说,在同一作用域下允许存在同名的函数,但是这些同名的函数,是需要被一些条件给约束的。
2、函数重载的条件
函数重载的三个条件:
1、函数的形参类型不同构成函数重载
2、函数的形参的顺序不同构成函数重载
3、函数的形参的数量不同构成函数重载
就是因为这样所以程序在运行阶段,call函数的时候函数地址和名称也是不一样的,所以就有了函数重载这个概念。
五、引用
1、引用的概念
引用不是创建一个新的变量,而是给已经存在的变量取一个别名,而引用就是和这个变量共同使用同一个地址空间。
2、引用的用法以及注意事项、作用场景
用法:变量类型 & 引用名 = 以及存在的变量
int a=10;
int &b=a;
这个时候的b就是a的别名,b的改变是会影响a的,
在使用引用的时候需要注意以下几点:
1、引用是不可以用在常量上的,因为常量是有常性的,用了就会被销毁的
2、引用是需要初始化的
3、引用的类型要和被引用的对象的类型相同
4、一个引用只能对应一个变量(就是说引用具有唯一性),而一个变量可以有多个引用
引用在C++的作用是非常大的,都说C/C++的效率很高,运行的时候非常的快,原因就是可以直接通过地址直接对变量进行操作,那引用就会有如下的使用场景了
1、做函数的参数
2、做函数的返回值
因为在传值和传引用这样两个地方,是由很大的区别,当调用函数的时候是传值调用时,编译器会生成传递的那个值的临时拷贝,然后再把这份临时拷贝的值给形参,放回的值也是这个原理,这样就会使得程序运行变得很慢,如果是一个很小的拷贝还好,如若是一个非常大的拷贝那就会有很大的影响;但是传的是引用和放回的引用是直接对形参和放回值进行操作的,所以效率会很高
3、引用和指针的区别(重点)
1.引用概念上定义一个变量的别名,指针存储一个变量地址。
2. 引用在定义时必须初始化,指针没有要求
3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何
一个同类型实体
4. 没有NULL引用,但有NULL指针
5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
位平台下占4个字节)
6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
7. 有多级指针,但是没有多级引用
8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
9. 引用比指针使用起来相对更安全
4、补充
在C语言中的空指针是NULL,而在C++中的空指针是关键字nullptr