C++ 11 新特性 关键字

news/2025/3/19 11:21:43/

auto关键字

1. 什么是auto,auto有什么作用?

我们先来看一段代码:

#include<iostream>
#include<vector>int main()
{using namespace std;vector<int>arr={2,4,6,8};//遍历arr向量for(vector<int>::iterator it=arr.begin();it!=arr.end();it++){cout<<*it<<" ";}cout<<endl;return 0;
}

在这案例中,我们可以看到,声明为迭代器的变量前缀非常长,这样来写代码非常不美观,也不方便。auto的出现很大程度是为了解决该问题。

现在我们来回答刚才的问题:

在C++中,auto 是一个关键字,它的作用是让编译器自动推导变量的类型,根据变量的初始化表达式来确定其类型。这个特性从C++11标准开始引入,被广泛用于简化代码和提高代码的可读性,使用auto关键字可以大大提高我们的编码效率。

下面是使用atuo关键字的代码:

#include<iostream>
#include<vector>int main()
{using namespace std;vector<int>arr={2,4,6,8};//遍历arr向量//auto会自动将it转换成赋值变量的类型for(auto it=arr.begin();it!=arr.end();it++){cout<<*it<<" ";}cout<<endl;return 0;
}

显然,代码变美观和简洁了不少。

2. auto和const

我们先来看一段代码:

int x=0;
const auto n = x;
auto f = n;
const auto & r1=x;
auto r2 = r1;

在第2行代码中,n为const int,auto被推导为int。
在第3行代码中,n为const int类型,但是auto却被推导为int类型,这说明当右边的表达式带有const属性时,auto不会使用const属性,而是直接推导出non-const类型。
第4行代码中,auto被推导为int类型,这个很容易理解,不再赘述。
第5行代码中, r1是const int&类型, auto也被推导为const int类型,这说明当const和引用结合时,auto的推导将保留表达式的const类型。

总结∶

1.当类型不为引用时,auto的推导结果将不保留表达式的const属性;

2.当类型为引用时,auto 的推导结果将保留表达式的const属性。

3. auto的高级用法

auto除了可以独立使用,还可以和某些具体类型混合使用,这样auto表示的就是“半个”类型,而不是完整的类型︰

int x = 0;
auto *pt1 =&x; //pt1为int*, auto推导为int 
auto pt2 = &x; //pt2为int*, auto推导为int*
auto &r1 = x; //r1为int&, auto推导为int
auto r2 = r1; //r2为int, auto推导为int

4. auto的使用限制

在C++11中,

1.auto不能在函数的参数中使用

//错误案例
auto test1(int n)
{return n*2;
}

2.auto不能作用于类的非静态成员变量

//错误案例
class test2{public:auto name;auto age;
};

3.auto不能作用于模板参数

#include<iostream>
template<class T>
class Stack{
private:std::vector<T> elements;
public:void push(T value) {elements.push_back(value);}T pop() {T value = elements.back();elements.pop_back();return value;}
}int main()
{//错误案例Stack<auto>s;  s.push(1);return 0;
}

4.auto不能用于推导数组类型

#include<iostream>
int main()
{int arr[]={2,3,4,6};auto auto_arr=arr;    //错误案例return 0;
}

当然,上诉的限制是在C++11的情况下,其他版本可能有所变化。


http://www.ppmy.cn/news/1070398.html

相关文章

“光遗传学治疗晚期视网膜色素变性”,9月6日星明优健执行总裁孙思睫博士直播分享

视网膜色素变性 &#xff08;Retinitis pigmentosa&#xff0c;RP&#xff09; 是一种进行性、单基因遗传的神经退行性致盲疾病&#xff0c;由超过71个不同的基因突变引起&#xff0c;并影响着全球超过200万人。视网膜色素变性会破坏视网膜的感光细胞&#xff0c;可能导致患者完…

【Java转Go】快速上手学习笔记(八)之Redis篇一(go-redis)

go-redis 这篇是关于Redis的笔记。这里用的是 go-redis &#xff0c;要先下载 go get github.com/go-redis/redis连接 使用 redis.NewClient() 创建连接&#xff0c;这个函数参数是一个叫 Options 的结构体&#xff0c;这个结构体的属性字段就是设置连接redis的相关参数&…

React钩子函数之forward结合useImperativeHandle钩子的基本使用

React钩子函数是React框架中非常重要的一部分&#xff0c;其中forward和useImperativeHandle是两个常用的钩子函数。这两个钩子函数可以结合使用&#xff0c;用来实现一些高级的功能。 首先&#xff0c;让我们来了解一下forward钩子函数。它的作用是将父组件中的props传递给子…

ZooKeeper与Paxos

Apache ZooKeeper是由Apache Hadoop的子项目发展而来&#xff0c;于2010年11月正式成为了Apache的顶级项目。ZooKeeper为分布式应用提供了高效且可靠的分布式协调服务&#xff0c;提供了诸如统一命名服务、配置管理和分布式锁等分布式的基础服务。在解决分布式数据一致性方面&a…

springcloud-nacos简述

Spring Cloud alibaba: nacos服务注册中心&#xff0c;配置中心 服务注册中心 1.项目父工程添加springcloudalibaba依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><ve…

元素隐式具有 “any“ 类型,因为类型为 “string“ 的表达式不能用于索引类型

今天在写ts文件的过程中&#xff0c;我遍历了一个对象&#xff0c;然后取值的时候发现爆红,如下图&#x1f447; 经过我一通排查&#xff08;原因我对ts也不是很熟练&#xff09;&#xff0c;了解到大致意思是说key的值类型不是string类型&#xff0c;在javascript中是默认给你…

apk 静默安装

apk 静默安装 - 欧颜柳 - 博客园 (cnblogs.com) 如果需要应用进行静默安装&#xff0c;则需要满足一下两个条件 1 必须添加权限 <uses-permission android:name"android.permission.INSTALL_PACKAGES" /> 2 必须是系统应用&#xff0c;或者系统签名应用 方法…

在Linux上安装SonarQube

安装SonarQube在Linux上需要按照以下步骤进行操作&#xff1a; 下载并解压SonarQube安装包。可以从SonarQube官方网站下载最新的稳定版&#xff0c;然后使用命令解压缩安装包。例如&#xff0c;使用命令unzip sonarqube-9.7.zip解压缩。 创建一个新的用户并设置权限。SonarQu…