C++11&14新特性 —— auto详解

系列文章目录

C++11新特性大全+实例

前言

C++ 这门编程语言的历史可以追溯至 1979 年,当时的 Bjarne Stroustrup(C++ 之父,后续简称 Stroustrup)还在使用 Simula 语言进行开发工作。

1998 年,C++ 标准委员会发布了第一版 C++ 标准,并将其命名为 C++ 98 标准。据不知名人士透露,《带注释的C++参考手册》这本书对 C++ 98 标准的制定产生了很大的影响。

经过作者的不断迭代,一本书往往会先后发布很多个版本,其中每个新版本都是对前一个版本的修正和更新。C++ 编程语言的发展也是如此。截止到目前(2020 年),C++ 的发展历经了以下 3 个个标准:

2011 年,新的 C++ 11 标准诞生,用于取代 C++ 98 标准。

2014 年,C++ 14 标准发布,该标准库对 C++ 11 标准库做了更优的修改和更新;

2017 年底,C++ 17 标准正式颁布;

虽然学习 C++11 需要花些时间,但这是非常值得的;C++11 非常实用,它不但提高了开发效率,还让程序更加健壮和优雅。程序员应该乐于升级换代已有的知识,而学习和使用 C++11 早就是大势所趋。

|版本声明:山河君,未经博主允许,禁止转载

一、存储类型auto

1.auto的规则

在刚学习C/C++的时候,基本上都学过extern、static、auto、register四大存储类型。而auto定义不同局部栈变量,一般隐藏auto,作为默认自动存储类别。所以在以前实际使用中,写不写auto都一样,这使得这个关键字变得非常鸡肋。

而C++11赋予了auto新的定义,让其做自动类型推导,也就是说,编译器可以在编译期间自动推算出变量的类型,这样就可以更加方便的编写代码了。

2.auto的用法

接下来就其用法举两个列子:

auto n = 1;
auto p = &n;
auto ch = “http://c.biancheng.net/cplus/”;

其中
第一行n为int类型
第二行p为int*类型
第三行ch为const char* leixing

但是值得注意的是:

auto 仅仅是一个占位符,在编译器期间它会被真正的类型所替代。或者说,C++ 中的变量必须是有明确类型的!!! 只是这个类型是由编译器自己推导出来的。

例如以下会出错:

struct AA
{
	auto i; //编译不通过,因为i没有明确制定类型
};

AA a;
a.i = 10;

3.auto的混合使用

除了直接定义auto+变量名的方式外,同样可以用auto表示不完全的类型。
例如:

int  x = 0;
auto *p1 = &x;   //p1 为 int *,auto 推导为 int
auto  p2 = &x;   //p2 为 int*,auto 推导为 int*
auto &r1  = x;   //r1 为 int&,auto 推导为 int
auto r2 = r1;    //r2 为  int,auto 推导为 int

4.auto的应用

上面说完用法后,那么看一看实际使用中会应用到哪些场景
在我们使用容器想要遍历时,以前基本上是使用迭代器,编写会很麻烦,例如

int main(){
    vector< vector<int> > v;
    vector< vector<int> >::iterator i = v.begin();
    return 0;
}

现在可以

int main(){
    vector< vector<int> > v;
    auto i = v.begin();
    return 0;
}

在使用类模板时,以下例子因为不知道调用get方法得到的是什么类型的返回值,所以在使用时还要定义

template <typename T1, typename T2>  //额外增加一个模板参数 T2
void func(void){
    T2 val = T1::get();
    cout << val << endl;
}

使用auto

template <typename T>
void func(void){
    auto val = T::get();
    cout << val << endl;
}

二、auto 的限制

1.不能进行传参

auto 不能在函数的参数中使用。我们之前在前文时说过auto需要注意使用时必须是有明确类型,也就是必须初始化。

2.auto 关键字不能定义数组

例如:

int main(int argv, char* argc[])
{
	char ch[] = "heh";
	//auto test[] = ch; //错误
	static auto test = ch;
}

3.C++14

C++11中想要使用auto类型作为返回值需要搭配decltype,具体请看decltype一篇
C++14中使得auto可以作为返回值了
例如:

auto fun(int i)
{
	if (i == 0)
		return 12; 	
}

但是下面就是错误的

auto fun(int i)
{
	if (i == 0)
		return 12;
	if (i == 1)
		return "hello world"; //编译出错,因为返回类型不明确
}

总结

仍在持续更新中~
如果对您有所帮助,请点个赞!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值