引用、new和delete
-
引用:是C++对C语言的扩充,故C语言不含 引用
-
什么是引用:变量的引用就是该变量的别名,变量和变量的的引用代表同一个变量,引用可多层嵌套
int a = 5; //定义整型变量a,并赋值为5 int& b = a; //定义整型引用b,来引用a int* p = &a; //定义整型指针p,存储a的地址 /*区分取地址符与引用 引用: 紧跟在数据类型后; 取地址符: 除上 */
-
引用的注意事项:
-
不可单独存在,只有声明,没有定义,其必须依靠变量存在;不可先声明引用而不引用任何变量,这与指针是完全不同的
int& b; //事先声明定义一个引用是错误的
-
声明一个引用时,必须同时对其初始化,即声明该引用代表哪一个变量;但有一种特殊情况例外:【当某个变量的引用作为函数形参时】此时,形参不必在声明中初始化,他的初始化是在函数调用时的虚实结合实现的,即作为形参的引用是实参的别名,例:
void swap(int& a, int& b);
-
声明一个引用后,不能再让其作为另一个变量的引用了。例如:
int a1 = 2, a2 = 5; int& b = a1; //正确 int& b = a2; //错误
-
不能建立引用数组,例如:
int a[5] = {0}; int& b[5] = a; //错误 int& c = a[0]; //正确(C++新标准支持)
-
可以建立引用的引用(C++新标准支持),也可以建立引用的指针,例如:
int a = 3; int& b = a; //正确 int& c = b; //正确 int* p = &b; //正确,得到的是变量a的地址 *p = 5; c = 6;
-
-
引用与指针联系:
关于引用的性质,如果在程序中声明了b是变量a的引用,实际上在内存中为b开辟了一个指针型的存储单元,在其中存放变量a的地址,输出引用b时,就输出b所指向的变量a的值,相当于输出*b。引用其实就是一个指针常量,他的指向不能改变,只能指向一个指定的变量。所以,引用的本质还是指针,所有引用的功能都可以由指针实现。C++之所以增加引用的机制,是为了方便用户,用户可以不必具体去处理地址,而把引用作为变量的“别名”来理解和使用,而把地址的细节隐藏起来,来降低操作难度和程序安全性。
-
-
使用new和delete动态分配内存:
-
作用:当我们需要函数返回超过函数作用域的值时,局部变量无法保证安全性,且是错误的
-
生命周期:
- C++ 中的 new操作符 和C语言中的 malloc 函数类似,如果不主动 delete 掉这段申请的内存的话,它会一直存在,直到进程结束后系统会回收掉这段资源
- 如果delete掉这段申请的内存,则这段申请到的内存的生命周期为从new(申请一段内存)到delete(释放掉这段内存)这段时间
-
使用方法:
int* p = (int*)malloc(sizeof(int)); //C语言中使用 malloc 来申请一个int类型变量的内存 *p = 5; free(p); int* p = new int(5); //C++ 中使用 new 来申请一个int类型变量的内存 delete p; //删除变量 int* p = new int[5]; //使用new申请一个包含5个int元素的数组 delete [] p; //删除数组
还有一个更重要的new优于malloc的地方,C++中的类class,用new申请一个类对象的时候,对象申请成功之后会默认调用其构造函数,而C语言中的malloc只是会申请空间,但是不会调用对象的构造函数。
-