c++ auto类型用法总结
来源:互联网 发布:淘宝企业店发布产品 编辑:程序博客网 时间:2024/06/03 19:46
一、用途
auto是c++程序设计语言的关键字。用于两种情况
(1)声明变量时根据初始化表达式自动推断该变量的类型
(2)声明函数时函数返回值的占位符
二、简要理解
auto可以在声明变量时根据变量初始值的类型自动为此变量选择匹配的类型。
举例:对于值x=1;既可以声明: int x=1 或 long x=1,也可以直接声明 auto x=1
三、用法
根据初始化表达式自动推断被声明的变量的类型,如:
auto f = 3.14; //doubleauto s("hello"); //const char*auto z = new auto(9); //int *auto x1 = 5, x2 = 5.0, x3 = 'r'; //错误,必须是初始化为同一类型
但是,这么简单的变量声明类型,不建议用auto关键字,而是应更清晰地直接写出其类型。
auto关键字更适用于类型冗长复杂、变量使用范围专一时,使程序更清晰易读。如:
std::vector<int> vect; for(auto it = vect.begin(); it != vect.end(); ++it) { //it的类型是std::vector<int>::iterator std::cin >> *it; }
或者保存lambda表达式类型的变量声明:
auto ptr = [](double x){return x*x;};//类型为std::function<double(double)>函数对象
四、优势
(1)拥有初始化表达式的复杂类型变量声明时简化代码。
比如:
#include <string> #include <vector> void loopover(std::vector<std::string>&vs) { std::vector<std::string>::iterator i=vs.begin(); for(;i<vs.end();i++) { } }
变为:
#include <string> #include <vector> void loopover(std::vector<std::string>&vs) { for( auto i=vs.begin();;i<vs.end();i++) { } }
使用std::vector<std::string>::iterator来定义i是C++常用的良好的习惯,但是这样长的声明带来了代码可读性的困难,因此引入auto,使代码可读性增加。并且使用STL将会变得更加容易
(2)可以避免类型声明时的麻烦而且避免类型声明时的错误。
但是auto不能解决所有的精度问题。比如:
#include <iostream> using namespace std; int main() { unsigned int a=4294967295;//最大的unsigned int值 unsigned int b=1; auto c=a+b; cout<<"a="<<a<<endl; cout<<"b="<<b<<endl; cout<<"c="<<c<<endl; }
五、注意的地方
(1)可以用valatile,pointer(*),reference(&),rvalue reference(&&) 来修饰auto
auto k = 5; auto* pK = new auto(k); auto** ppK = new auto(&k); const auto n = 6;
(2)用auto声明的变量必须初始化
(3)auto不能与其他类型组合连用
(4)函数和模板参数不能被声明为auto
(5)定义在堆上的变量,使用了auto的表达式必须被初始化
int* p = new auto(0); //fine int* pp = new auto(); // should be initialized auto x = new auto(); // Hmmm ... no intializer auto* y = new auto(9); // Fine. Here y is a int* auto z = new auto(9); //Fine. Here z is a int* (It is not just an int)
(6)以为auto是一个占位符,并不是一个他自己的类型,因此不能用于类型转换或其他一些操作,如sizeof和typeid
(7)定义在一个auto序列的变量必须始终推导成同一类型
auto x1 = 5, x2 = 5.0, x3='r'; /<span style="font-family: Arial, Helvetica, sans-serif;">/错误,必须是初始化为同一类型</span>
(8)auto不能自动推导成CV-qualifiers (constant & volatile qualifiers)
(9)auto会退化成指向数组的指针,除非被声明为引用
0 0
- c++ auto类型用法总结
- [C++] auto类型说明符
- C/C++const类型用法总结
- C/C++ const类型用法总结
- C/C++ const类型用法总结
- C/C++ const类型用法总结
- c++primer之auto类型说明符
- Modern C++(一)auto自动类型推导
- C++primer---constexpr、类型别名、auto、decltype
- auto和decltype的用法总结
- c++(14)处理类型--auto类型说明符
- C/C++——auto,static,register,extern用法
- c存储类型的关键字auto extern static regisger
- C++primer学习之:类型别名和auto
- [C++]高效使用c++11--理解auto类型推导
- [effective modern c++][2]理解auto类型推断
- Effective Modern C++:Item 2 ->弄清auto类型推断
- 《Effective Modern C++》读书笔记(2) -- auto类型推导(auto type deduction)
- Netty框架之异步事件驱动模型
- vs2015,cout提示是未定义标识符
- MyEclipse 2016 CI 3带来全新升级的JavaScript代码工具——JSjet
- python_正则表达式(二)
- onLayout过程学习
- c++ auto类型用法总结
- 汇编学习(十七)X86汇编学习 (4) GDT
- 监控 Grafana + collectd + InfluxDB
- python deque vs Queue vs list
- 批量缩小8页PPT文档至一页打印
- 谈谈Java加密技术(七)
- 【学习笔记】Java数据类型
- WPF学习(入门)
- 局部图像特征描述概述