前言:本篇文章的重点
1.C++中的类型指示符auto
2.借由auto实现的范围for
3.C++为什么要创建nullptr而不是用原本的NULL。
目录
- 一.auto
- 1.auto的含义及使用
- 2.auto使用注意事项
- 3.范围for(重头戏)
- 范围for注意事项
- 二.nullptr
一.auto
1.auto的含义及使用
在C++11中,标准委员会赋予了auto的含义为:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时推导而得到。
#include<iostream>
using namespace std;int main()
{int a = 10;auto b = 20; auto c = 'x';auto d = 1.1;//typeid(变量名).name()能够显示变量的类型cout << typeid(a).name() << endl; cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;cout << typeid(d).name() << endl;、//auto e; 错误示范,auto变量必须在定义时初始化return 0;
}
注意:使用auto定义变量时必须初始化,因为编译阶段编译器需要根据初始化表达式来推导auto的实际类型,因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译阶段会将auto替换为变量实际的类型。
2.auto使用注意事项
1.定义变量时必须初始化,这点在上面提到过了。
2.定义一行时,数据必须是同一种类型。
3 .auto不能作为函数的参数
这点跟第一点有关系,因为参数没有初始化。
4.auto不能直接用来声明数组
3.范围for(重头戏)
C语言中的for循环遍历在C++中有着更为便捷的方式——范围for,使用起来非常方便。
int main()
{int arr1[] = { 1,2,3 };//C语言写法for (int i = 0; i < sizeof(arr1) / sizeof(int); i++){cout << arr1[i] << " ";}cout << endl;//C++写法//1.依次取arr1中数据赋值给x//2.自动判定结束//3.自动迭代for (auto x: arr1){cout << x << " ";}return 0;
}
范围for注意事项
仍以上述代码为例,各位觉得下面代码运行后显示的是什么?
int main()
{int arr1[] = { 1,2,3 };for (auto x: arr1){x = x*2;}for (auto x : arr1){cout << x << " ";}return 0;
}
运行结果如下,可以看到数据并没有*2,这是因为上述代码只是依次取arr1中数据赋值给x,x的改变并不会影响数组中的数据。
那么若是想改变该怎么办呢?
答:可以使用引用, auto后加上&,代表x是数组中数据的别名,这样改变x就会改变数组中的数据
但是不能使用指针,因为指针类型与原数据类型不匹配。
这种时候就可以看到C++使用引用的高明之处了。
int main()
{int arr1[] = { 1,2,3 };for (auto& x: arr1) //auto后加上&,代表x是数组中数据的别名,这样改变x就会改变数组中的数据{x = x*2;}/*for (auto* x : arr1) //auto* 类型与arr1数据类型(int)不匹配{x = x * 2;}*/for (auto x : arr1){cout << x << " ";}return 0;
}
二.nullptr
前面的几篇文章提到过C语言中的漏洞很多,nullptr就是为了弥补NULL的不足而诞生的。
下例通过函数重载构建func函数,各位觉得显示的是什么?
按照我们设计代码的初衷,Func(0)应该打印int,而Func(NULL)应该打印int*。
void Func(int x)
{cout << "int" << endl;
}
void Func(int* x)
{cout << "int*" << endl;
}
int main()
{Func(0);Func(NULL);Func(nullptr);
}
运行结果如下:
可以发现Func(NULL)调用的是第一个函数,与预期结果不同。
这是因为在C语言中有个一个宏定义#define NULL 0
,NULL被定义为字面常量0。
因此为了代码的健壮性,C++后来创建了nullptr。
文末BB:对哪里有问题的朋友,尽管在评论区留言,若哪里写的有问题,也欢迎朋友们在评论区指出,博主看到后会第一时间确定修改。最后,制作不易,如果对朋友们有帮助的话,希望能给博主点点赞和关注.