背景
在编程语言的分类中,C++ 被分为是“静态语言”,因为在 C++ 中通常在使用一个变量前必须要有定义,而在“动态语言”如:Ptython 中变量就不需要申明。
静态类型和动态类型的主要区别在于对变量进行类型检查的时间点:静态类型主要发生在编译阶段;动态类型发生在运行阶段。
动态类型实现的本质是类型推导,而在 C++ 中类型推导的实现方式之一就是 auto 关键字。
auto
auto 用于变量类型的自动推断:在声明变量的时候,根据变量初始值的类型自动为此变量选择匹配的类型,而不需要显示指定类型。
auto str = "hello";//str 类型为 const char *
auto a;//错误,无法推导
auto 自动类型推断发生在编译期,因此 auto 定义变量必须立即初始化,这样编译期才能推断它的实际类型。
auto 的基本使用
①.使用 auto 简化变量声明
std::map<string, int> m_map;
for (auto iter = m_map.begin(); iter != m_map.end(); ++iter)
{
}
②.使用 auto 可以避免声明错误
int a = 10;
char b = 1;
auto c = a+ b;//c 类型为 int
③.auto 的自适应性
float func(float a ){ return a ;}
float a = 1.0f;
auto x = func(a);
//当 func 返回类型改变,比如改为返回 double ,x类型自动改变
auto 的类型推导
①.auto 和指针
如果 auto 声明的是指针类型,则 auto 和 auto * 效果一样。
int a = 10;
auto x = &a;//x 为 int* 类型
auto *y = &a;//y 为 int* 类型
②.auto 和引用
如果 auto 声明的是引用类型,则必须使用 auto& 。
int a = 10;
auto & z = a;//z 为 int& 类型
③.auto 和 const
声明为 auto 类型的变量并不能从其初始化表达式中带走 const 限定符。
int func();
const auto x = func;//x为 const int 类型
auto y = x;// y 为int 类型
④.auto 和 {}
C++ 支持使用 {} 进行统一初始化。
auto x= { 30 }; // x 类型为 std::initializer_list<int>
auto y{ 40 }; // y 类型为 int
⑤.auto 和函数指针
float func(float a ){ return a ;}
auto f = func;// f 类型为 float(*)(float)