IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C++】auto关键字、范围for、nullptr关键字 -> 正文阅读

[C++知识库]【C++】auto关键字、范围for、nullptr关键字

本篇博客一起来继续学习C++的语法

auto关键字nullptr关键字
范围forlinux如何使用C++11规则

0.linux设置c++11

在linux平台下想使用C++11标准有两个办法

方法1是在.cpp文件的最开头加入下面的这个语句

#pragma GCC diagnostic error "-std=c++11"

但是这个方法哈,我发现加了它之后使用nullptr还是会报错,但是auto和typeid都可以使用了

方法2是在编译的时候在加上-std=c++11

g++ -std=c++11 test.cpp -o test 

使用这个方法比较完美

1.auto关键字

image-20220512151648466

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

简而言之,这个关键字的作用就是自动给变量设置一个数据类型

1.1基本使用

#include<iostream>
#include<typeinfo>
using namespace std;
int TestAuto()
{
     return 10;
}
int main()
{
    int a = 10;
    auto b = a;
    auto c = 'a';
    auto d = TestAuto();
    auto e = "abc";
    char str[20]="hello auto!";
    auto f =str;
    
    cout << typeid(b).name() << endl;
    cout << typeid(c).name() << endl;
    cout << typeid(d).name() << endl;
    cout << typeid(e).name() << endl;//PKC
    cout << typeid(f).name() << endl;//Pc
    //VS下会打印完整的类型,返回的是字符串
    //linux下只会打印缩写,其中PKc代表pointer(p) to Const(k) Char(c)
    //而如果是字符串,打印的就是Pc,pointer to Char
    return 0;
}

在上面的代码中,我们使用了typeid().name()来打印变量的类型,使用这个函数需要引用头文件<typeinfo>

image-20220512152027874

可以看到,编译器正确打印出了每一个变量的数据类型,auto自动判断并给这些变量赋予了数据类型

  • VS下typeid()函数会打印完整数据类型
  • Linux下只会打印缩写
  • 其中PKc代表pointer(p) to Const(k) Char(c),也就是const char*
  • PK代表const修饰的指针;P代表指针,如Pc是char*、Pi是int*
 auto e; //无法通过编译,使用auto定义变量时必须对其进行初始化

使用auto关键字的时候,必须要在定义的时候初始化变量。

其实这很好理解,本来auto就是一个自动根据初始化内容来赋予数据类型的关键字,如果你不给我初始化内容,我哪知道你需要赋值的类型是谁呢?

因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。

1.2使用细节

①和指针/引用同时使用

如图,auto在处理指针变量的时候,带不带*是不受影响的

Pi是pointer to int,即int的指针

image-20220512155356566

②在同一行定义多个变量

如果使用auto在同一行定义多个变量的时候,前后定义的变量必须是同一个类型的

auto a=1,b=3;//可以
auto a=1,b=2.4;//不可以

1.3auto不能用的地方

①auto不能作为数组的声明

比如下面的这种情况,是不行的

auto arr[]={1,2,3,4};

image-20220512160036618

②auto不能用来作为函数的参数和返回值

void test(auto a);
auto test(int a);

函数的返回值和传参都不能是auto

因为这样会给使用者带来极大的误导,我连你的返回值是什么类型都不知道,我用啥来接收??再用一次auto吗??😂


为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法

其实auto最大的作用还是在C++11提供的新式循环中使用👇

2.范围for循环

2.1基本用法

在之前,如果我们想遍历一个数组,一般会使用下面的方式

这是最经典的for循环语句,想必你肯定不陌生

image-20220512161318650

但这方法太麻烦了!每次都要弄一个sizeof来计算长度,这不纯纯坐牢吗

QQ图片20220504102516

于是哈,C++11就利用auto关键字提供了另外一个遍历数组的方法

 for(auto e : arr)
        cout << e << " "; 

没错!就是这么简单的参数设置,就能让auto自己打印出数组内的值!

这也太省事了👍

image-20220512161804366

这里注意哈,如果在for里面设置的e没有带&引用,其对数据内容的更改是不会改变源数组的。你可以理解为这里是临时传了参数给了e,然后再打印e的值

  • 如果想修改数组的内容,给e带上引用即可

编译器会自动判断什么时候数组打印完毕,所以你想打印一个字符数组也是没问题的

image-20220512162302202

我是用的这个vim配置好像更加智能,因为他把数组中空着的部分也“打印出来了”。实际上编译器并不会打印空出来的值

image-20220512162339450

这点可以在for循环结束后再打印EOF来验证

image-20220512162357457

与普通循环类似,可以用continue来结束范围for循环,也可以用break来跳出整个循环。

另外,直接使用变量类型来操作范围for也是可以的

image-20220512164206236

2.2使用条件

使用范围for的时候,必须给定一个准确的范围

  • 在遍历数组的时候,这个范围就是数组的开头和结尾
  • 对于类而言,应该提供begin和end的 方法,begin和end就是for循环迭代的范围

也就是说,我们必须给定一个数组名,而不能给定一个指针

void TestFor4(int*ptr)
{
	for(auto e : ptr)
		cout<<e<<" ";
}

比如这种使用方法就是错误的,因为编译器不知道这个数组到底什么时候结束

image-20220512163308203

即便把传参改成数组的形式也是不行的

image-20220512163533804

至于为什么范围for里面用的是冒号嘛,好问题,我不知道

QQ图片20220512164211

下一个知识点!


3.nullptr关键字

nullptr是C++11引入的新关键字

3.1NULL

在C语言中,NULL代表空指针

int*p1=NULL;

NULL实际是一个宏,在c语言头文件stddef.h中,可以看到如下代码:

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

可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量

3.2问题引出

那么问题就来了,如果我在调用函数的时候传了NULL,编译器究竟会把它识别成int类型,还是识别成指针类型呢?

image-20220512164946770

比如在上面的函数重载代码中,编译器就不知道要调用哪一个函数了,除非你给NULL来一个(int*)强制转换一下

编译文件会看到如下报错

test.cpp|17 col 5 error| call to 'f' is ambiguous

小码农英语课堂开课啦!今天学习的是ambiguous

image-20220512165109011

好得很

所以说!C++急需另外一个东西的加入来避免NULL的这种模糊传参情况

3.3使用nullptr

其他需要介绍的就无啦,你只要知道,nullptr不再是一个代表0的值,而是一个专门的关键字,代指空指针的情况,就OK啦!

image-20220512165503376

image-20220512165553384

最后是几点注意:

  • 在使用nullptr表示指针空值时,不需要包含头文件,因为它是C++11的关键字
  • 在C++11中,sizeof(nullptr)=sizeof((void*)0)
  • 为了提高代码的稳定性,后续写C++代码的时候一律用nullptr,不再使用NULL

结语

好啦,本篇C++的笔记到这里就结束喽

有什么问题大家可以在评论提出哈

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 17:26:01  更:2022-05-18 17:27:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/12 21:34:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码