• C++入门(4):auto、范围for、nullptr


    一、关键词 auto

    1.1 概念

    auto 作为一个新的类型指示符来指示编译器,auto 声明的变量必须由编译器在编译时期推导而得。

    #include 
    using namespace std;
    
    int main()
    {
        int a = 0;
        
        auto b = a;
        auto c = &a;
        auto* d = &a;
        auto& e = a;
        
        cout << typeid(b).name() << endl;
        cout << typeid(c).name() << endl;
        cout << typeid(d).name() << endl;
        cout << typeid(e).name() << endl;
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    PS:

    1. 使用 auto 定义变量时,必须对其初始化。在编译阶段,编译器根据初始化表达式推导 auto 的实际类型。
    2. auto 并非一种类型声明,而是一种类型声明时的**”占位符“**,编译器在编译阶段会将 auto 替换为变量的实际类型。
    1.2 使用
    1. 在声明指针时,auto 与 auto* 没有实际区别;在声明引用时,必须使用 auto&
    int main()
    { 	
        int a = 0;
        
        auto c = &a;
        auto* d = &a;
        auto& e = a;
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 同一行定义多个变量时,变量类型必须相同,否则编译器会报错。
    int main()
    {
        auto a = 10, b = 2.2;// error C3538: 在声明符列表中,“auto”必须始终推导为同一类型
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. auto 不能用来声明数组
    int main()
    {
        auto a[4] = {1, 2, 3, 4};// error C3318: “auto []”: 数组不能具有其中包含“auto”的元素类型
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. auto 不能用来做函数参数类型
    void f(auto) // error C3533: 参数不能为包含“auto”的类型
    {
        // ...
    }
    int main()
    {
        f(0);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    二、基于范围的for循环

    2.1
    #include 
    using namespace std;
    
    int main()
    {
    	int array[] = { 1, 2, 3, 4, 5 };
    	for (auto e : array)
    		cout << e << " ";
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    PS:

    与普通for循环相同,可以使用continue结束本次循环,使用break结束整个循环。

    2.2 范围for的使用条件
    1. for循环的迭代范围必须是确定的
    void Func(int arr[]) // error:arr数组的范围不确定
    {
        for (auto e : arr)
            cout << e << " ";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    三、指针空值nullptr

    观察以下程序:

    void f(int)
    {
        cout << "f(int)" << endl;
    }
    
    void f(int*)
    {
        cout << "f(int*)" << endl;
    }
    
    int main()
    {
        f(0);
        f(NULL);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    NULL实际是个宏,在文件中,可以看到:

    #ifndef NULL
        #ifdef __cplusplus
            #define NULL 0
        #else
            #define NULL ((void *)0)
        #endif
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    C++11中引入新关键词 nullptr 表示指针空值,使用时不需要包含头文件。

    sizeof(nullptr)sizeof((void)0)* 所占字节数相同,后续表示指针空值时最好使用 nullptr。

  • 相关阅读:
    关于QTableWidget的it所占内存的释放问题
    2022年跨境电商卖家必知的黑色星期五营销策略
    测试到底是个啥
    前端时间分片渲染
    [Mac软件]Downie 4.6.34视频下载工具
    Windows下绑定线程到指定的CPU核心
    三、西瓜书——神经网络
    js实现星空雨随鼠标移动
    搭建环境AI画图stable-diffusion
    jupyter notebook使用相对路径的方法
  • 原文地址:https://blog.csdn.net/taduanlangan/article/details/134025132