嘿嘿嘿没错封面是我画的
今天我们来讲一下
A
u
t
o
Auto
Auto是什么
,
,
,
不会的小伙伴听好了!
不会的小伙伴听好了!
不会的小伙伴听好了!
在C++编程语言中,
auto
是一个关键字,其用途随着 C + + C++ C++标准的发展而发生了变化:
- C++98/C++03 中,
auto
关键字用于声明一个具有自动存储持续期 ( a u t o m a t i c s t o r a g e d u r a t i o n ) (automatic storage duration) (automaticstorageduration)的局部变量,这通常是指函数内部的变量,默认情况下它们会在离开作用域时自动销毁。但在旧标准中,这个关键字很少被使用,因为显式指定类型更为常见。
- C + + 11 C++11 C++11及以后版本 引入了一种新的用法,使得
auto
成为了一个非常重要的关键字,用于类型推断。现在,
auto
主要用于声明变量时,编译器会根据初始化表达式的类型自动推断变量的类型。例如:
int x = 10;
auto y = x; // 编译器推断 y 为 int 类型
这极大地提高了代码的简洁性和可读性,尤其是在处理复杂的类型、模板表达式或lambda表达式返回类型时。
- C + + 11 C++11 C++11中的函数返回类型推断:
auto
也可以与
decltype
结合使用,或者作为函数返回类型的占位符,编译器会根据函数体内的返回表达式推断函数的返回类型 。 。 。
template<typename T>
auto max(T a, T b) -> decltype(a > b ? a : b) {
return a > b ? a : b;
}
自 C + + 14 C++14 C++14开始,还可以更简洁地写成:
template<typename T>
auto max(T a, T b) {
return a > b ? a : b;
}
- 范围基础循环(range - based for loop)中也经常使用
auto
编译器会根据迭代的对象自动推断循环变量的类型 : : :
std::vector<int> vec = {1, 2, 3};
for (auto i : vec) {
// 这里 i 的类型会被推断为 int
}
5. 5. 5.
auto
并不是动态类型,一旦类型被编译器推断出来后,该变量在整个生命周期内都会保持同一类型,并且不能再赋给不同类型的值
。
。
。
另外,尽管类型是编译时推断出来的,但这种推断并不会影响程序的运行时效率,因为所有类型信息在编译阶段就已经确定
。
。
。
那么,auto到底怎么用???
在C++编程语言中,
auto
关键字有两种主要用途:
- 类型推断 ( T y p e D e d u c t i o n ) (Type Deduction) (TypeDeduction): 自 C + + 11 C++11 C++11开始,
auto
关键字被赋予了新的意义,主要用于类型推断。当声明一个变量并使用
auto
关键字时,编译器会根据初始化表达式右侧的类型自动推断出变量的类型。
例如:
auto x = 5; // x 的类型被推导为 int
auto pi = 3.14; // pi 的类型被推导为 double
auto name = "John"; // name 的类型被推导为 const char*
std::vector<int> vec = {1, 2, 3};
auto it = vec.begin(); // it 的类型被推导为 std::vector<int>::iterator
- 基于范围的for循环 ( R a n g e − B a s e d F o r L o o p ) (Range-Based For Loop) (Range−BasedForLoop):
auto
在基于范围的 f o r for for循环中特别有用,它可以自动推导出循环变量的类型,简化迭代容器元素的过程:
std::vector<std::string> words = {"hello", "world"};
for (auto word : words) {
// word 的类型被推导为 std::string
std::cout << word << ' ';
}
decltype 和模板元编程中的应用:
auto
还可以用在
decltype
或模板元编程中,用于指定函数返回类型或者其他需要延迟计算类型的场景:
template<typename _Tx, typename _Ty>
auto multiply(_Tx x, _Ty y) -> decltype(x * y) {
return x * y;
}
在这个例子中,
auto
后面跟着一个返回类型说明符
-> decltype(x * y)
这意味着函数
multiply
的返回类型将是
_Tx
和
_Ty
类型相乘的结果类型。
总之,
auto
关键字极大地提高了代码的可读性和简洁性,减少了显式类型声明的需求,并且有助于减少由于类型变更导致的修改工作量。但它并不意味着动态类型,编译器在编译期就会确定
auto
变量的确切类型,并且
auto
声明的变量必须立即初始化。
——Auto——