【C++入门第三期】auto 和 范围for 及 指针空值nullptr

auto简介(C11)

早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但随着编译器越来越智能能自动判断哪些该存在那人为干预作用不大,导致一直没有人去使用它

C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。

auto简介的使用

如下p1 和 p2 是所接收到的值是一样的,所以两段代码作用一致。只是p1之前有段长长的类型名称std::string::iterator , 而 p2 只用 auto 就声明好了自己的类型名;

	std::string::iterator p1 = d1.begin();
	auto p2 = d1.begin();

正如上述,当写代码时遇到稍长的类型名就可以用auto代替,auto 会自动推倒要接收变量类型。

当然喜欢的话 int 及 double 等均可以用 auto , auto 均能根据接收变量或常量自动推导其类型并不是长的才可以用,

	auto doub = 1.1;//double类型
	auto left = 1;//int 类型

auto的使用细则

  1. auto与指针和引用结合起来使用

用auto声明指针类型时用auto 和 auto* 没有任何区别,但用auto声明引用类型时则必须加&

int a = 10;
auto p = &x;
auto* p2 = &x;
auto& r = x;
  1. 在同一行定义多个变量

当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量
在这里插入图片描述

auto不能推导的场景

  1. auto不能作为函数的参数

因为编译器无法对参数的实际类型进行推导
在这里插入图片描述
2. auto不能直接用来声明数组
在这里插入图片描述

范围for循环(C++11)

以前 c 语言 如果要遍历一个数组,可以按照以下方式进行:

扫描二维码关注公众号,回复: 14782090 查看本文章
void test2()
{
    
    
	int arr[] = {
    
     1,2,3,4,5,6,7,8,9 };
	int size = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < size; i++)
	{
    
    
		cout << arr[i] << ' ';
	}
}

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误

因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
如下相当简便:

void test3()
{
    
    
	int arr[] = {
    
     1,2,3,4,5,6,7,8,9 };
	for (int ch : arr)//ch用于接收arr的每个元素
	{
    
    
		cout << ch << ' ';
	}
}

注意:与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环

范围for的使用条件

  1. for循环迭代的范围必须是确定的

对于数组而言,就是数组中第一个元素和最后一个元素的范围;
对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。

注意:以下代码就有问题,因为for的范围不确定
在这里插入图片描述
2. 迭代的对象要实现++和==的操作。(关于迭代器这个问题,以后会讲,现在提一下,没办法
讲清楚,现在大家了解一下就可以了)

指针空值nullptr(C++11)

在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下
赋个空指针对其进行初始化:

void test4()
{
    
    
	int* pp = NULL;
}

NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:
在这里插入图片描述
可以看到NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如
在这里插入图片描述
上述程序本意是想通过fun(NULL)调用指针版本的fun(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖,只能使用将NULL强制转为int才会调用fun(int)函数

在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器
默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void
*)0。

nullptr(C++11)

针对上述NULL的小问题,C++11 将 nullptr 作为新的关键字引入,nullptr用于表示指针空值,并且使用时不需要包含头文件
在这里插入图片描述
所以为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

猜你喜欢

转载自blog.csdn.net/ZhuGeBin26/article/details/129540427