一、左值和右值的区别?左值引用和右值引用的区别,如何将左值转换成右值?
左值:当一个对象作为左值的时候,使用的是对象的身份,即对象在内存中的地址,左值是具有持久的状态
右值:当一个对象作为右值的时候,使用的是对象的值,右值具有短暂性
1、左值引用和右值引用的区别
左值引用
- 通过&获得左值引用,左值引用只能绑定左值,不能绑定到右值上,但常量引用例外。
int a;
int &val1 = a; //合法,绑定左值
int &val2 = 10; //非法,不可以绑定右值
const int &val3 = 10; //合法,常量引用可以绑定右值
右值引用
- 右值引用时C++11新特性
- 通过&&获得右值引用,右值引用只能绑定右值
int a;
int &&val1 = a; //非法,右值引用不能绑定左值
int &&val2 = 10; //合法,右值引用可以绑定右值
2、如何将左值转化为右值
使用move()函数可以强制将左值转化为右值,一般move使用时会带std::,因为move太容易明明冲突了
int a = 10;
int &&val = std::move(a);
二、std::move()函数的实现原理
- std::move()的主要作用时将一个左值转化为右值引用,进而实现移动赋值,避免普通赋值时出现的内存拷贝
- std::move()的实现原理:接收到一个传入的参数后,使用
remove_reference
将参数的全部引用去掉,得到传入的参数的基本类型,然后再加上右值引用&&后输出
三、什么是指针?指针的大小及用法?
指针
指向另外一种类型的复合类型。
指针的大小
在 64 位计算机中,指针占 8 个字节空间。
四、什么是野指针和悬空指针?
野指针
“野指针”是指不确定其指向的指针,未初始化的指针为“野指针”。
悬空指针
若指针指向一块内存空间,当这块内存空间被释放后,该指针依然指向这块内存空间,此时,称该指针为“悬空指针”。
悬空指针知道指针的指向,只是其指向的内存空间被释放了
五、C++ 11 nullptr 比 NULL 优势
NULL:预处理变量,是一个宏,它的值是 0,定义在头文件 中,即 #define NULL 0。
nullptr:C++ 11 中的关键字,是一种特殊类型的字面值,可以被转换成任意其他类型。
nullptr 的优势:
- 有类型可以进行类型检查,类型是 typdef decltype(nullptr) nullptr_t;,使用 nullptr 提高代码的健壮性。
- 函数重载:因为 NULL 本质上是 0,具有int和bool的双重属性,在函数调用过程中,若出现函数重载了两个版本,一个版本的形参是布尔类型,一个版本的形参是int类型,这时候如果传递的实参是 NULL,就出出现不知和哪一个函数匹配的情况;但是传递实参 nullptr 就不会出现参数类型匹配错误。
六、指针和引用的区别
- 指针所指向的对象在程序运行过程中可以改变,而引用所绑定的对象一旦绑定就不能改变。
- 指针可以为空,但是引用必须绑定对象。(是否可为空)
- 指针自身是一个对象,而引用不是一个对象
- 指针可以有多级,但是引用只能一级。(是否能为多级)
七、常量指针、指针常量和指向常量的指针常量
1、常量指针(指向对象在指针眼中是常量)
常量指针的定义
const 的位置在指针声明运算符 * 的左侧。只要 const 位于 * 的左侧,无论它在类型名的左边或右边,都表示指向常量的指针。 左侧表示该指针指向的类型,即以 * 为分界线,其左侧表示指针指向的类型,右侧表示指针本身的性质。
/以下两种定义均是常量指针
const int * p;
int const * p;
常量指针的特性
- 常量指针指向的对象的值不能通过这个指针来修改,但常量指针指向的对象可以是一个变量,常量指针只是限制了通过这个指针修改变量的值。
- 虽然常量指针指向的对象的值不能通过常量指针来修改,可是因为常量指针本身是一个变量,因此,常量指针可以绑定到新的对象上。
2、指针常量(指针自己是常量)
指针常量的本质上是个常量,只不过这个常量的值是一个指针。
指针常量定义:const 位于指针声明操作符右侧,表明指针本身是一个常量,* 左侧表示该指针指向的类型,即以 * 为分界线,其左侧表示指针指向的类型,右侧表示指针本身的性质。
int var;
int * const c_p = &var;
指针常量的特性
- 指针对象的值是指针指向对象的地址,常量指针因为指针的值是常量,因此指针常量不能更换指向的对象
- 指针常量知识不能更换指向的对象,但可以通过指针常量更改指向对象的值
3、指向“常量”的指针常量(这里的指向“常量是在指针眼中是常量”)
同时具备常量指针和指针常量的性质,既不可以更换指针指向的对象,也不允许通过指针更改指向对象的值。
八、函数指针和指针函数的区别
函数指针
函数指针本质是一个指针变量,只不过这个指针指向一个函数。函数指针即指向函数的指针。
指针函数(一般不这么叫,就直接说是返回指针的函数)
指针函数本质是一个函数,只不过该函数的返回值是一个指针。相对于普通函数而言,只是返回值是指针。
函数指针和指针函数的区别
本质不同:指针函数本质是一个函数,其返回值为指针。函数指针本质是一个指针变量,其指向一个函数。
定义形式不同:
- 指针函数定义方式:
int* fun(int tmp1, int tmp2);
- 函数指针定义方式:
int (*fun)(int tmp1,