C++初阶2--1

简介: C++初阶2--1

一,auto关键字

开门介绍:


       在C++准有规定中,auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量是由编译器在编译时期推导而得。具体简单运用如下:


#include <iostream>
using namespace std;
int main() {
    int a = 0;
    int b = a;
    auto c = a;
    auto d = &a;
    auto* e = &a;
    //typeid是输出指定数据的类型
    cout << typeid(c).name() << endl;
    cout << typeid(d).name() << endl;
    cout << typeid(e).name() << endl;
    return 0;
}

运行图:


e0440318510e43978c817d839f50bf07.png


       可看出,auto可用来存储任意类型,像上面说的,它是一种类型提示符,提示系统声明的变量属于什么类型。


1-1,auto的使用

       auto的使用其实不是向上面一样,auto在C++中真正的用武之地在于后面学习的复杂结构中,如C++中迭代器的使用,容器的运用等,比如vector::iterator it = v.begin();结构很复杂,使用auto可直接优化为auto it = v.begin()。(这里只是演示,我们只需明白auto的用法即可,具体深入使用后面的文章会具体讲解)。


       auto的使用有着以下注意要素:


       1,auto的使用必须初始化。auto是用来简化类型的,系统在编译阶段需要根据auto表达式来推导出auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。


       2,当用auto声明指针类型时,auto和auto*没有任何区别,但用auto声明引用类型时则必须 加&。因为引用的本质就是指定数据的"别名",类型与之相同,如果不加&,系统将不知是否使用引用引用型,而指针类型是"独特的",系统可以区分。


       3,auto可以在同一行定义多个变量,但是这些变量必须是相同的类型,否则编译器将会报错,因为编译器在编译阶段只对第一个类型进行推导,然后用推导出来的类型定义其他变量。


       4,auto不支持函数的形参使用和函数的返回值使用,原因是当系统遍历到此函数的形参auto型时,相当于没有初始化一样,而一旦做返回值使用,将会出现很多麻烦。(这里与C++内部的复杂构造有关,在这里就不做过多说明)。


1-2,基于范围auto的for循环

       在C++11标准介绍中,考虑到了for循环使用的麻烦,所以C++11中就引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围,具体的细节和解说请看以下代码。初学者可能有些听不懂迭代的感念,不过本文这里不做重点,这里我们只需明白下面代码如何用auto使用即可,具体的知识后文会讲解,这里只是为后面打基础。


void TestFor()
{
    int array[] = { 1, 2, 3, 4, 5 };
    //依次取数组中的所有数据赋值给别名e
    //自动判断结束,自动++往后面走
    //由于引用的使用,下面的for循环相当与将数组中所有元素的乘2
    for (auto& e : array)
        e *= 2;
    //依次输出数据2 4 6 8 10
    for (auto e : array)
        cout << e << " ";
}

二,nullptr的运用

       nullptr相当于C语言中的NULL,C++专门制定此关键字也是为了弥补C中NULL的不足。C语言中的NULL其实是一个宏,直接将其定义为0,但这样以来都会产生一些不避免的麻烦,因为在C++98标准规定中,0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0,而nullptr的使用完美的解决了这一问题,所以,在后序的置空运用中,我们需改用nullptr。


C++初阶2--2https://developer.aliyun.com/article/1424514?spm=a2c6h.13148508.setting.22.214f4f0eDzCQ1n

相关文章
|
3天前
|
编译器 C语言 C++
c++初阶------类和对象(六大默认构造函数的揭破)-3
c++初阶------类和对象(六大默认构造函数的揭破)
|
3天前
|
编译器 C语言 C++
c++初阶------类和对象(六大默认构造函数的揭破)-2
c++初阶------类和对象(六大默认构造函数的揭破)
|
3天前
|
存储 编译器 C语言
c++初阶-------类和对象-2
c++初阶-------类和对象
|
3天前
|
安全 编译器 C语言
C++初阶------------------入门C++(三)
C++初阶------------------入门C++(三)
|
3天前
|
存储 Linux 编译器
C++初阶------------------入门C++(二)
C++初阶------------------入门C++(二)
|
3天前
|
编译器 C语言 C++
C++初阶------------------入门C++(一)
C++初阶------------------入门C++(一)
|
3天前
|
存储 编译器 对象存储
【C++基础(十)】C++泛型编程--模板初阶
【C++基础(十)】C++泛型编程--模板初阶
【C++基础(十)】C++泛型编程--模板初阶
|
3天前
|
编译器 C语言 C++
【C++初阶(九)】C++模版(初阶)----函数模版与类模版
【C++初阶(九)】C++模版(初阶)----函数模版与类模版
20 0
|
3天前
|
存储 编译器 Linux
【C++初阶(十)】C++模板(进阶) ---非类型模板参数、模板的特化以及模板的分离编译
【C++初阶(十)】C++模板(进阶) ---非类型模板参数、模板的特化以及模板的分离编译
24 0
|
3天前
|
存储 C++ 容器
【C++初阶】STL详解(十)set、map、multiset、multimap的介绍及使用
【C++初阶】STL详解(十)set、map、multiset、multimap的介绍及使用
35 0