也谈C++11里的auto类型

1.C++的强类型语言特性

C语言本身是一种强类型语言,在C语言基础之上的C++也是一种强类型语言。在C和C++之中,一切变量(包括函数),都必须明确标明类型。只有类型确定,才会被编译器认为是一种可以接受的语法。

由于C++本身的强类型特性,传统的C++开发会有很多特点:

1)任何变量和函数都必须明确标明类型;

2)如果两个不一致类型的变量进行比较或者赋值,要么报错,要么会被隐式转换(隐式转换会告警);

3)C++语言本身,或者说面向对象语言本身有个重载功能,重要原因是强类型;由于语言本身类型是强类型的,必须对类似功能的函数,进行重载,才可以具有类似的功能。

当然,强类型语言的优点是:由于类型是强类型,所以在编译初期,就可以确定语言的类型,导致编译时候就可以检查出错误;同时,由于类型确定,编译时可以比较快速确定类型,并快速编译,然后快速运行。

2.推断类型语言的崛起

随着计算机性能的提高,计算机可以飞速运行,甚至可以JIT执行,也就是可以便解释,边执行。这也让计算机可以运行很多“笨重”或者性能不高的语言。

与之相应的,许多不是强类型的语言开始崛起。最具有典型意义的是python;python是一种弱类型的语言;对于该语言来说,任何变量的类型都不是提前声明的,而是在运行的时候进行推断的。由于这些语言的类型不是强类型,让编程语言开发的门槛变得更低。这也让很多企业和软件从业者不再过分关注技术和语言本身,而更注重工程性,从而也推动了IT产业的发展。

PS:语言确实只是个工具,IT产业更注重的是工程性,而不是其他。因此,简单的语言,或者说快速的工程迭代,也是个必然趋势。

3.auto类型

auto类型,是C++11引进的一种语法。该语法的特点是:不公开声明变量的类型,而是让编译器推断该变量的类型。该语法和C++传统的强类型并不一致,但在新的推断类型语言的崛起之后,也让C++语言不再固守绝对强类型这一原则。

值得注意是,在其他现代语言中,也借鉴了类型推断这一特性。诸如Golang这语言,虽然是强类型的,但在函数内部,针对静态变量,也可以用 := 这一运算符,对变量类型进行推断。

C++11的auto变量,带来了很大便利。对于很多C++工程师来说,可以肆无忌惮的进行变量声明,并不再过分考虑变量类型的适应性。从使用者的角度来讲,确实带来了很多好处。

4.是否要用auto和如何用auto

但C++11的auto变量,也可能带来很多问题。具体体现为:

1)这种语法是C++的强类型语言的宗旨相偏离;

2)会造成变量的理解混乱。

因此,我个人的观点是:

1)不要随意使用auto,如果类型可以确定的话,避免类型推断;

2)在非常复杂的变量或者迭代器声明时,使用auto;因为,复杂的变量也许并不难理解,只是没有必要完全写出来;而迭代器最主要的是迭代的功能,而不是具体类型的确定。

案例如下:

list<int> lstTest;

auto it = lst.begin();

PS:虽然IT产业的特点是工程性,但如果工具足够好,效率足够高,还是尽可能保证效率。

猜你喜欢

转载自blog.csdn.net/wangzhezhilu001/article/details/103677275