也谈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产业的特点是工程性,但如果工具足够好,效率足够高,还是尽可能保证效率。

### C++11新特性概述 C++11引入了许多新的特性和改进,这些变化不仅增强了语言的功能性还提高了开发人员编写代码的效率。下面列举了一些重要的C++11新特性,并附带一些面试中可能出现的相关问题及解答。 #### 右值引用与移动语义 右值引用和转移语义在C++中提供了高效的资源管理方法[^3]。当对象作为临时量存在时(即所谓的“右值”),可以利用它们来避免不必要的复制开销。这使得大数据结构的操作更加高效,尤其是在频繁创建销毁的对象间传递所有权的情况下特别有用。 ```cpp class Widget { public: // Move constructor Widget(Widget&& other) noexcept : data(other.data){ other.data = nullptr; } // Move assignment operator Widget& operator=(Widget&& other) noexcept{ if(this != &other){ delete[] data; data = other.data; other.data = nullptr; } return *this; } private: int* data; }; ``` #### 智能指针 智能指针是一种特殊的指针类型,在其生命周期结束时自动释放所指向内存的空间。C++11增加了三种类型的智能指针:`unique_ptr`, `shared_ptr` 和 `weak_ptr`。每种都有不同的用途场景,比如独占拥有权(`unique_ptr`)或是共享多个所有者之间(`shared_ptr`)等。 ```cpp #include <memory> std::unique_ptr<int> up(new int(42)); // unique ownership auto sp = std::make_shared<std::string>("hello"); // shared ownership with reference counting ``` #### Lambda表达式 Lambda允许定义匿名内联函数,简化了某些情况下回调机制的设计模式。lambda表达式的语法非常简洁直观,支持捕获环境变量的能力使其成为强大的工具之一。 ```cpp // A simple lambda that adds two numbers and returns the result. auto add = [](int a, int b){return a+b;}; std::cout << "Sum is:" << add(5,7); ``` #### Unordered Containers (如unordered_map) 除了传统的关联容器外,C++11也加入了无序版本的数据结构,例如`unordered_set`、`unordered_multiset`以及`unordered_map`等等。这类容器内部采用哈希表实现,因此能够提供接近O(1)的时间复杂度来进行查找、插入或删除操作[^4]。 ```cpp #include <iostream> #include <unordered_map> int main(){ std::unordered_map<std::string,int> word_count; ++word_count["apple"]; ++word_count["banana"]; for(const auto& pair : word_count) std::cout<<pair.first<<" occurs "<<pair.second<<"\n"; } ``` #### Bind函数 `std::bind`是一个用于创建函数适配器的标准库组件,它可以将任意数量的实际参数绑定到指定的目标调用上形成一个新的可调用实体。此功能对于需要延迟计算或者部分应用场合十分方便[^5]。 ```cpp using namespace std::placeholders; auto bound_function = std::bind(&someClass::memberFunction,_1,"fixed_argument"); bound_function(instance_of_someClass); // Calls memberFunction on instance passing it as first argument along with fixed string value. ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值