目录
一、简介
C++是C语言的延伸,由本贾尼∙斯特劳斯特卢普于1983年前后创立出来,并在1998年的版本开始被投入使用,学习C++之前最好先学习C语言,下面介绍一下两者的区别:
- C语言面向过程,C++面向对象
- C++能够对函数进行重载,可使同名的函数功能变得更加强大
- C++可以使用引用传参,引用传参比起指针传参更加快,指针传参还需要传送,而引用传参不需要传送参数,就能使函数共用一个变量
- C++使用了类,能够继承,继承使得定义相似的类时能够直接从上一层得到一些方法或变量来进行直接使用
- C++比C语言功能强大的同时,也带来了更复杂的语法,但C++的效率仍然不如C语言,C语言适合底层开发,C++适合c/s的软件开发
二、输入输出
(1)输出
std::cout<<"hello world"<<std::endl
std是一个命名空间,cout代表C++output,是C++的标准输出,因为C++有命名空间的概念,所以使用时需要注明来源哪个命名空间
,及用"::"这个域声明符号,<<这个符号就代表着管道输出方向,像流一样输出到终端;
endl代表换行符。
(2)输入
std::cin>>变量名
cin代表C++input,代表从标准输入中获取数据存放到变量
若想省略std::,需要在代码中添加:using namespace std;代表打开std这个命名盒子,以后使用这个盒子内的变量就不需要指明作用域。
(3)C++输入输出的特点
- 自适应数据类型;不需要像C一样加%d、%s等格式符,编译器会自动识别类型;
- 可以连续操作;将输入输出看成一个管道流数据即可。
(4)注意点
- 使用标准输入cin、标准输出cout、endl之前,一定要加上命名空间(除非在使用之前将std命名空间全部打开)
- 小心使用重载运算符<< >>
- 在使用标准输入的时候,不能在后面加std::endl
三、指针与动态内存开辟
(1)指针变量
用来存储地址的变量,在C语言中,如果地址类型不一致,只会报警告,而在C++中会直接报错,因为C++语法中对类型的检查更为严格,所以要严格保持一致;
(2)动态内存的申请方法
C语言申请堆空间:malloc calloc
释放堆空间:free
C++:使用运算符(关键字)new和delete
new --》malloc+构造函数
delete --》free+析构函数
(3)申请格式
数据类型 *变量名 = new 数据类型;
数据类型 *变量名 = new 数据类型(初始值);
数据类型 *变量名 = new 数据类型[数据元素个数];
(4)释放格式
delete 指针变量:释放单个对象
delete []指针变量:释放连续的多个变量
(5)总结
C语言中的malloc free是函数,C++语言中的new delete是运算符;new在申请内存的同时,还会调用对象的构造函数,而malloc只会申请内存;同样,delete在释放内存之前,会调用对象的析构函数,而free只会释放内存。
四、命名空间
(1)引出
实际开发中,多个工程师负责同一个项目的代码编写,可能会导致变量的命名冲突,而命名空间可以很好的解决这个问题,其类似一个盒子,每个工程师都会在自己的盒子内编写代码,当其他工程师的代码需要引用时,只需要添加相应的命名空间指明,即可正确使用。
(2)使用方式
1)引进整个命名空间--将这个盒子全部打开
格式:using namespace 命名空间名字;
2)引进命名空间的某个成员--将这个盒子中的某个成员的位置打开
格式:using 命名空间名字::成员名
3)调用的时候指定是哪一个命名空间下的成员
格式:cout<<命名空间名字::成员名
命名空间可以分开定义,也就是说,你在定义一个命名空间之后,如果后面想要在这个命名空间里面再次添加某些数据成员或函数成员,可再次接着定义。
(3)匿名命名空间
只可以在本文件中使用,限制该空间成员的作用域,类似C语言的static修饰。
五、引用
(1)产生的原因
在传参的两大势力中,值传参书写方式简单,但不能修改变量所在内存空间的数据;地址传递能够修改变量所在内存空间的数据,但是需要复杂的解引用写法,而且使用过程中容易出现空指针、野指针等问题,导致程序不安全。是否有一种方法,集中两者的优点:既能书写简单,同时也能修改内存空间的数据,提高安全性呢?引用可以实现这一点。
(2)概念
简单点讲,引用就是对一个变量或者常量取别名,对引用进行操作与对变量进行操作效果完全一样。其是一种关系型声明的类型,说明它跟别的变量的关系,它所声明的变量不占内存空间,通俗来讲,是已有变量的别名,来说明跟已有变量的关系,所以引用变量的类型要跟已有变量的类型保持一致。
引用的本质就是指针常量,即void * const p。
(3)定义格式
指针定义:数据类型 * 指针名 = &变量
引用定义:数据类型 & 引用名 = 变量(数据类型必须与变量类型一致,所以必须要初始化)
(4)引用特点
- &在定义的时候不是取地址运算符,而是起标识作用,表示给某个变量或者常量起一个别名,所以引用不是变量。
- 在定义引用的时候,数据类型指的是目标变量或常量的数据类型;
- 定义引用的时候,必须初始化。
- 引用定义完毕后,相当于目标变量有两个名称,也就是目标原变量名和引用名,直接使用引用名就相当于直接操作该目标变量对应的内存空间。
- 引用定义完毕后,不能再把该引用名作为其他变量名的别名,即不能改变指向。
- 引用本身不占用存储单元,仅仅是作为变量的别名。对引用求地址,就是对目标变量求地址。故&ra和&a相等。
- 不能建立引用的数组。因为数组是一个实际占有存储空间的集合,而引用不占存储空间,但是可以建立数组的引用。
- 如果引用的对象是常量,那么引用必须用const修饰。
(5)引用与常量
将一个引用设置为常量后,不能通过该引用修改数据,但仍可通过被引用的变量来改变
被引用的数据是常量,引用本身也必须是常量。
(6)引用的应用
- 作为参数传递
- 作为函数返回值
特点:
- 以引用的形式返回函数值,定义函数时需要在函数名前加&;
- 用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本;
- 不能返回局部变量的引用,因为局部变量在函数调用结束之后内存空间就被释放了;
- 如果一个函数的返回值是一个引用,那么函数调用作为左值。