C/C++你必须知道的小知识(45)

299 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情

1.5.11 简述一下 C++11 中四种类型转换

参考回答

​ C++中四种类型转换分别为const_cast、static_cast、dynamic_cast、reinterpret_cast,四种转换功能分别如下:

  1. const_cast

​ 将const变量转为非const

  1. static_cast

    ​ 最常用,可以用于各种隐式转换,比如非const转const,static_cast可以用于类向上转换,但向下转换能成功但是不安全。

  2. dynamic_cast

    ​ 只能用于含有虚函数的类转换,用于类向上和向下转换

    ​ 向上转换: 指子类向基类转换。

    ​ 向下转换: 指基类向子类转换。

    ​ 这两种转换,子类包含父类,当父类转换成子类时可能出现非法内存访问的问题。

    ​ dynamic_cast通过判断变量运行时类型和要转换的类型是否相同来判断是否能够进行向下转换。dynamic_cast可以做类之间上下转换,转换的时候会进行类型检查,类型相等成功转换,类型不等转换失败。运用RTTI技术,RTTI是”Runtime Type Information”的缩写,意思是运行时类型信息,它提供了运行时确定对象类型的方法。在c++层面主要体现在dynamic_cast和typeid,vs中虚函数表的-1位置存放了指向type_info的指针,对于存在虚函数的类型,dynamic_cast和typeid都会去查询type_info。

​ 4. reinterpret_cast

​ reinterpret_cast可以做任何类型的转换,不过不对转换结果保证,容易出问题。

注意: 为什么不用C的强制转换:C的强制转换表面上看起来功能强大什么都能转,但是转换不够明确,不能进行错误检查,容易出错。

答案解析

​ 无

1.5.12 简述一下 C++ 11 中 auto 的具体用法

参考回答

​ auto用于定义变量,编译器可以自动判断变量的类型。auto主要有以下几种用法:

  1. auto的基本使用方法

    (1)基本使用语法如下

auto name = value; //name 是变量的名字,value 是变量的初始值

​ 注意: auto 仅仅是一个占位符,在编译器期间它会被真正的类型所替代。或者说,C++ 中的变量必须是有明确类型的,只是这个类型是由编译器自己推导出来的。

​ (2)程序实例如下

auto n = 10; 
auto f = 12.8; 
auto p = &n; 
auto url = "www.123.com";

​ a. 第 1 行中,10 是一个整数,默认是 int 类型,所以推导出变量 n 的类型是 int。

​ b. 第 2 行中,12.8 是一个小数,默认是 double 类型,所以推导出变量 f 的类型是 double。

​ c. 第 3 行中,&n 的结果是一个 int* 类型的指针,所以推导出变量 f 的类型是 int*。

​ d. 第 4 行中,由双引号""包围起来的字符串是 const char* 类型,所以推导出变量 url 的类型是 const char*,也即一个常量指针。

  1. auto和 const 的结合使用

    (1) auto 与 const 结合的用法

    ​ a. 当类型不为引用时,auto 的推导结果将不保留表达式的 const 属性;

    ​ b. 当类型为引用时,auto 的推导结果将保留表达式的 const 属性。

    (2)程序实例如下

int  x = 0;
const  auto n = x;  //n 为 const int ,auto 被推导为 int
auto f = n;      //f 为 const int,auto 被推导为 int(const 属性被抛弃)
const auto &r1 = x;  //r1 为 const int& 类型,auto 被推导为 int
auto &r2 = r1;  //r1 为 const int& 类型,auto 被推导为 const int 类型

​ a. 第 2 行代码中,n 为 const int,auto 被推导为 int。

​ b. 第 3 行代码中,n 为 const int 类型,但是 auto 却被推导为 int 类型,这说明当=右边的表达式带有 const 属性时,auto 不会 使用 const 属性,而是直接推导出 non-const 类型。

​ c. 第 4 行代码中,auto 被推导为 int 类型,这个很容易理解,不再赘述。

​ d. 第 5 行代码中,r1 是 const int & 类型,auto 也被推导为 const int 类型,这说明当 const 和引用结合时,auto 的推导将保留 表达式的 const 类型。