C++初阶语法——类型指示符auto和空指针nullptr

前言:本篇文章的重点
1.C++中的类型指示符auto
2.借由auto实现的范围for
3.C++为什么要创建nullptr而不是用原本的NULL。

一.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:对哪里有问题的朋友,尽管在评论区留言,若哪里写的有问题,也欢迎朋友们在评论区指出,博主看到后会第一时间确定修改。最后,制作不易,如果对朋友们有帮助的话,希望能给博主点点赞和关注.
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_73390155/article/details/132225688