C++理论(五):语言特性

一、左值和右值的区别?左值引用和右值引用的区别,如何将左值转换成右值?

左值:当一个对象作为左值的时候,使用的是对象的身份,即对象在内存中的地址,左值是具有持久的状态
右值:当一个对象作为右值的时候,使用的是对象的值,右值具有短暂性

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。
nullptrC++ 11 中的关键字,是一种特殊类型的字面值,可以被转换成任意其他类型。

nullptr 的优势:

  1. 有类型可以进行类型检查,类型是 typdef decltype(nullptr) nullptr_t;,使用 nullptr 提高代码的健壮性。
  2. 函数重载:因为 NULL 本质上是 0,具有int和bool的双重属性,在函数调用过程中,若出现函数重载了两个版本,一个版本的形参是布尔类型,一个版本的形参是int类型,这时候如果传递的实参是 NULL,就出出现不知和哪一个函数匹配的情况;但是传递实参 nullptr 就不会出现参数类型匹配错误

六、指针和引用的区别

  1. 指针所指向的对象在程序运行过程中可以改变,而引用所绑定的对象一旦绑定就不能改变
  2. 指针可以为空,但是引用必须绑定对象。(是否可为空)
  3. 指针自身是一个对象,而引用不是一个对象
  4. 指针可以有多级,但是引用只能一级。(是否能为多级)

七、常量指针、指针常量和指向常量的指针常量

1、常量指针(指向对象在指针眼中是常量)

常量指针的定义
const 的位置在指针声明运算符 * 的左侧。只要 const 位于 * 的左侧,无论它在类型名的左边或右边,都表示指向常量的指针。 左侧表示该指针指向的类型,即以 * 为分界线,其左侧表示指针指向的类型,右侧表示指针本身的性质。

/以下两种定义均是常量指针
const int * p;
int const * p;

常量指针的特性

  1. 常量指针指向的对象的值不能通过这个指针来修改,但常量指针指向的对象可以是一个变量,常量指针只是限制了通过这个指针修改变量的值。
  2. 虽然常量指针指向的对象的值不能通过常量指针来修改,可是因为常量指针本身是一个变量,因此,常量指针可以绑定到新的对象上

2、指针常量(指针自己是常量)

指针常量的本质上是个常量,只不过这个常量的值是一个指针。
指针常量定义:const 位于指针声明操作符右侧,表明指针本身是一个常量,* 左侧表示该指针指向的类型,即以 * 为分界线,其左侧表示指针指向的类型,右侧表示指针本身的性质。

int var;
int * const c_p = &var; 

指针常量的特性

  1. 指针对象的值是指针指向对象的地址,常量指针因为指针的值是常量,因此指针常量不能更换指向的对象
  2. 指针常量知识不能更换指向的对象,但可以通过指针常量更改指向对象的值

3、指向“常量”的指针常量(这里的指向“常量是在指针眼中是常量”)

同时具备常量指针和指针常量的性质,既不可以更换指针指向的对象,也不允许通过指针更改指向对象的值。

八、函数指针和指针函数的区别

函数指针

函数指针本质是一个指针变量,只不过这个指针指向一个函数。函数指针即指向函数的指针

指针函数(一般不这么叫,就直接说是返回指针的函数)

指针函数本质是一个函数,只不过该函数的返回值是一个指针。相对于普通函数而言,只是返回值是指针。

函数指针和指针函数的区别

本质不同:指针函数本质是一个函数,其返回值为指针。函数指针本质是一个指针变量,其指向一个函数。
定义形式不同

  1. 指针函数定义方式
int* fun(int tmp1, int tmp2);
  1. 函数指针定义方式
int (*fun)(int tmp1, 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值