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

简介: C++入门(4):auto,范围for,nullptr

一、关键词 auto

1.1 概念

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

#include <iostream>
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;
}

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. 同一行定义多个变量时,变量类型必须相同,否则编译器会报错。
int main()
{
    auto a = 10, b = 2.2;// error C3538: 在声明符列表中,“auto”必须始终推导为同一类型
    return 0;
}
  1. auto 不能用来声明数组
int main()
{
    auto a[4] = {1, 2, 3, 4};// error C3318: “auto []”: 数组不能具有其中包含“auto”的元素类型
    return 0;
}
  1. auto 不能用来做函数参数类型
void f(auto) // error C3533: 参数不能为包含“auto”的类型
{
    // ...
}
int main()
{
    f(0);
    return 0;
}

二、基于范围的for循环

2.1
#include <iostream>
using namespace std;
int main()
{
  int array[] = { 1, 2, 3, 4, 5 };
  for (auto e : array)
    cout << e << " ";
  return 0;
}

PS:

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

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

三、指针空值nullptr

观察以下程序:

void f(int)
{
    cout << "f(int)" << endl;
}
void f(int*)
{
    cout << "f(int*)" << endl;
}
int main()
{
    f(0);
    f(NULL);
    return 0;
}

NULL实际是个宏,在<corecrt.h>文件中,可以看到:

#ifndef NULL
    #ifdef __cplusplus
        #define NULL 0
    #else
        #define NULL ((void *)0)
    #endif
#endif

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

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

相关文章
|
30天前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
33 2
C++入门12——详解多态1
|
30天前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
73 1
|
19天前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
16 0
|
19天前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
18 0
|
28天前
|
分布式计算 Java 编译器
【C++入门(下)】—— 我与C++的不解之缘(二)
【C++入门(下)】—— 我与C++的不解之缘(二)
|
28天前
|
编译器 Linux C语言
【C++入门(上)】—— 我与C++的不解之缘(一)
【C++入门(上)】—— 我与C++的不解之缘(一)
|
30天前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
27 0
|
18天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
21 4
|
18天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
18 4
|
18天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
17 1