目录
auto的介绍
当我们学习的越来越深入时,我们会发现有时候一个变量的类型我们可能不太容易知道,这时候该怎么办呢?
于是就引入了auto这个关键字。auto是一个类型指示符来指示编译器,就是告诉编译器变量的类型。其实,C语言和C++早期中也有auto这个关键字,但是用法和定义不一样。
auto的使用规则
auto与指针和引用结合起来使用
auto声明指针类型的变量时,auto 和 auto* 没有任何区别,但是auto声明引用类型时需要加&
看一下运行结果
根据运行结果,auto和auto*的类型在这里都是int*的类型。
auto定义多个变量
当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器就会报错,这是因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
第一行没有报错,但是第二行因为c的类型是int ,而d的类型是double,所以报错了。
auto不能使用的场景
auto不能作为函数的参数
auto不能直接用来声明数组
范围for
C语言中,我们都学过for循环,也听过 万物皆可for循环 这句话。那C嘎嘎中范围for又是啥呢?
范围for的语法
我们以前要遍历一个数组,要这样遍历:
对于一个有范围的集合来说,我们在说明它的范围,是不是有些多余了,有时候还会写错代码。于是C++11中引入了基于范围的for循环。for循环后的括号由“ :”分为两部分。第一部分是范围内用于迭代的变量,第二分部表示被迭代的范围。
我们看看结果;
范围for的使用条件
for循环的迭代的范围必须是确定的
迭代的对象要实现++和==的操作(后面会细讲)
指针空值nullptr
学过编程的都知道,我们在创建一个变量时最好给改变量一个合适的初始值,否则可能会出现不可预料的错误。假如我们创建一个指针,如果指针没有合适的指向,我们都会用NULL给指针初始化。
被初始化的指针p。
NULL其实是个宏
我们查看传统C头文件 stddef 中,NULL被定义为 常量 0。
但是,还是会遇到一些麻烦的
这段代码是什么意思呢?程序本来的意思是通过 NULL 调用 f(int*)函数。但是由于NULL被定义为0,所以最后调用的是f(int)函数。
C++98中,常量0可以是一个整型数字,也可以是无类型指针 void* 常量,但是编译器通常默认为是整型常量,如果要使用,必须强制类型转换为 void* 0。
所以,C++11中引入了nullptr这个关键字。
注意:
1 如果nullptr表示空指针时,不需要包含头文件。
2 C++11中,sizeof(nullptr)与sizeof((void*)0)所占的字节相同。
3 为了提高代码的健壮性,后面表示空指针最好用nullptr。