1、类型系统
1、定义:在编程语言中,“类型系统”是将“type”属性指定给不同计算机程序构造块的规则集。
2、使用类型系统的好处:
类型系统可以减少程序中可能出现的bug
类型系统减少BUG的方法是:
- 定义不同程序块间的接口
- 检查多个块之间是否以一致的方式连接在一起
3、静态类型&动态类型
程序设计语言的类型系统机制会检查连接在一起的多个块的一致性
(计算机程序的构造块:计算机程序构造块是不同大小粒度的计算机程序组成部分,它包括变量、表达式、函数或者模块等。)
上述检查若发生在编译期,称为静态类型
上述检查若发生在运行时,称为动态类型
上述检查若同时存在于编译期和运行时,称为混合类型
2、关键字auto
C++11中,auto关键字放在变量之前,作用是在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型
1、auto使用时必须初始化
auto a1 = 10; //正确
auto b1; //错误,编译器无法推导b1的类型
b1 = 10;
2、 定义在一个auto序列的变量必须始终推导成同一类型
auto a4 = 10, a5{20}; //正确
auto b4{10}, b5 = 20.0; //错误,没有推导为同一类型
3、如果初始化表达式是引用或const,则去除引用或const语义。
int a{10}; int &b = a;
auto c = b; //c的类型为int而非int&(去除引用)
const int a1{10};
auto b1 = a1; //b1的类型为int而非const int(去除const)
4、如果auto关键字带上&号,则不去除引用或const语意
int a = 10; int& b = a;
auto& d = b;//此时d的类型才为int&
const int a2 = 10;
auto& b2 = a2;//因为auto带上&,故不去除const,b2类型为const int
5、初始化表达式为数组时,auto关键字推导类型为指针。
int a3[3] = { 1, 2, 3 };
auto b3 = a3;
cout << typeid(b3).name() << endl; //输出int * (输出与编译器有关)
//typeid(b3).name()表示显示b3的类型
6、 若表达式为数组且auto带上&,则推导类型为数组类型。
(Note:数组定义不能用auto)
int a7[3] = { 1, 2, 3 };
auto& b7 = a7;
cout << typeid(b7).name() << endl; //输出int [3] (输出与编译器有关)
7、 C++14中,auto可以作为函数的返回值类型和参数类型
3、decltype(利用已知类型声明新变量)
在编译时推导一个表达式类型,而不用初始化
Note:
1、只做静态分析,不会导致类型表达式;
2、常用于泛型编程;
举例:
#include<iostream>
using namespace std;
int fun1() { return 10; }
auto fun2() { return 'g'; } // C++14
int main(){
// Data type of x is same as return type of fun1()
// and type of y is same as return type of fun2()
decltype(fun1()) x; // 不会执行fun1()函数
decltype(fun2()) y = fun2();
cout << typeid(x).name() << endl;//第一个类型是int
cout << typeid(y).name() << endl;//第二个类型是char
return 0;
}
decltype与auto的区别:
1、auto忽略最上层的const,decltype则保留最上层的const
2、auto忽略原有类型的引用,decltype则保留原有类型的引用
3、auto推断出原有类型,decltype推断出引用
4、auto推断时会实际执行,decltype不会执行,只做分析