C++ 新特性 | C++ 11 | auto 关键字

一、auto 关键字

1.1、静态类型,动态类型和类型推导

在编程语言分类中,C/C++C常常被认为是静态类型的语言。而有的编程语言则号称是“动态类型”的,比如python。通常情况下,“静”和“动”的区别是非常直观的。看看下面这段简单的python代码

  name=‘world\n’
  print 'hello, ' %name

这段代码中Python中输出hellow,world的实现。这就是编程语言中的“动态类型”,在运行时来进行类型检查,而C++中类型检查是在编译阶段。动态类型语言能做到在运行时决定类型,主要归功于一技术,这技术是类型推导。

不同于Python等动态类型语言的运行时变量类型推导,隐式类型定义的类型推导是发生在编译期,它的作用是让编译器自动推断出这个变量的类型。

1.2、使用 auto 进行类型推导

在之前的 C++ 版本中,auto 关键字用来指明变量的存储类型,它和 static 关键字是相对的。auto 表示变量是自动存储的,这也是编译器的默认规则,所以写不写都一样,一般也不写,这使得 auto 关键字的存在变得非常鸡肋。

C++11 赋予 auto 关键字新的含义,使用它来做自动类型推导。也就是说,使用了 auto 关键字以后,编译器会在编译期间自动推导出变量的类型,这样就不用手动指明变量的数据类型了,如下:

auto n = 2;
auto f = 1.8;
auto p = &n;
auto str = "my test";

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

1.3、auto 限制和规则

1)使用auto关键字的变量必须有初始值

使用 auto 类型推导的变量必须马上初始化,这个很容易理解,因为 auto 在 C++11 中只是“占位符”,并非如 int 一样的真正的类型声明。如果使用auto关键字的变量没有进行初始化编译时会报错,如下:

int main()
{
    auto a;
    return 0;
}

编译报错:

error: declaration of 'auto a' has no initializer

你可能感兴趣的:(C++,新特性,c++,开发语言)