首页 > 编程语言 >c++11新特性之关键字(关于auto、nullptr)

c++11新特性之关键字(关于auto、nullptr)

时间:2024-06-15 19:32:14浏览次数:27  
标签:11 int auto nullptr 类型 include 指针

1.auto

用途:

用于编译器自动推断出变量类型,这里列举几种比较典型的情况:


(1)自动类型推导

auto x = 10;       // x的类型是int  
auto y = 3.14;     // y的类型是double  
auto z = 'c';      // z的类型是char

(2)与迭代器一起使用:

当处理STL容器时,auto可以帮助我们自动推导迭代器的类型。

#include <vector>  
#include <iostream>  

using namespace std;
  
int main() {  
    vector<int> v = {1, 2, 3, 4, 5};  
    for (auto it = v.begin(); it != v.end(); ++it) {  
        cout << *it << ' ';  
    }  
    cout << '\n';  
/*
当你有一个迭代器 it 时,*it 就是迭代器所指向的容器元素的值。在遍历容器时,你通常会使用 it++ 来将迭代器移动到容器的下一个元素,然后使用 *it 来访问该元素的值。
*/
  
    // 使用C++11的基于范围的for循环(范围for循环)  
    for (auto elem : v) {  
        cout << elem << ' ';  
    }  
    cout << '\n';  
  
    return 0;  
}

(3)与lambda表达式一起使用:

当在lambda表达式中捕获变量时,可以使用auto来简化类型推导。

#include <iostream>  
#include <vector>  
#include <algorithm> 
using namespace std;
  
int main() {  
    vector<int> v = {1, 2, 3, 4, 5};  
  
    // 使用auto推导lambda表达式中捕获的变量的类型  
    auto is_even = [&](auto x) { return x % 2 == 0; };  
  
    for (auto i : v) {  
        if (is_even(i)) {  
            cout << i << ' ';  
        }  
    }  
    cout << '\n';  
  
    return 0;  
}  
  
// 注意:上述lambda中的auto参数仅在C++14及更高版本中可用

2.nullptr

用途:

  • 使用nullptr来初始化和比较指针。例如,int* ptr = nullptr; 使用nullptr初始化了一个指向int类型的空指针。
  • 当需要检查一个指针是否为空时,可以使用 if (ptr == nullptr) {...}
(1)类型安全
  • 在C++98/03中,空指针通常使用NULL宏来表示,这个宏通常被定义为0或((void*)0)。然而,这可能导致类型不明确的问题,因为NULL可以被隐式转换为任何指针类型。
  • nullptr的引入解决了这个问题,它具有独立的类型std::nullptr_t,只能被赋值给指针类型或传递给需要空指针的函数,从而增加了类型安全性。
(2)区分空指针和零值
  • 在C++98/03中,NULL既可以表示空指针,也可以表示整数零,这可能会导致混淆。
  • nullptr的引入使得空指针有了明确的表示,避免了这种混淆。
// C++11 之前  
int* ptr1 = NULL;  
int* ptr2 = 0;  
  
// C++11 及以后  
int* ptr3 = nullptr;
(3)与标准库的交互
  • C++标准库中的一些组件,如智能指针(unique_ptr和shared_ptr),需要一种明确的方式来表示空指针。使用nullptr可以确保这些组件正确地初始化和管理它们所拥有的资源。
(4)提高代码的可读性和可维护性
  • 使用nullptr可以使代码更加清晰,因为它明确表示了一个指针没有指向任何对象。这有助于减少由于空指针使用不当而导致的错误,并使代码更容易理解和维护。
(5)函数重载
  • 在函数重载中,nullptr的表现优于NULL或0。例如,如果有一个函数既接受整数参数又接受指针参数,并且你希望传递一个空指针参数,使用nullptr可以明确调用接受指针参数的函数版本,而使用0则会调用接受整数参数的版本。
#include <iostream>  

using namespace std;
  
// 函数重载,接受 int* 参数  
void foo(int* ptr) {  
    cout << "foo(int*): Received a pointer." << endl;  
    // 这里可以执行与 ptr 相关的操作  
}  
  
// 函数重载,接受 int 参数  
void foo(int value) {  
    cout << "foo(int): Received an integer." << endl;  
    // 这里可以执行与 value 相关的操作  
}  
  
int main() {  
    // 使用 nullptr 明确调用接受 int* 参数的 foo 函数  
    foo(nullptr); // 输出: foo(int*): Received a pointer.  
  
    // 使用 0 会导致调用接受 int 参数的 foo 函数,因为 0 可以隐式转换为 int  
    foo(0); // 输出: foo(int): Received an integer.  
  
    // 正常使用 int* 类型的指针  
    int x = 42;  
    foo(&x); // 输出: foo(int*): Received a pointer.  
  
    return 0;  
}
(6)RAII原则
  • RAII(Resource Acquisition Is Initialization)是C++中的一个重要概念,它强调资源的获取和释放应该与对象的生命周期绑定。nullptr的使用有助于实现这一原则,因为它提供了一种明确的方式来表示一个指针没有拥有任何资源。

标签:11,int,auto,nullptr,类型,include,指针
From: https://blog.csdn.net/liangkepaofu/article/details/139662705

相关文章

  • WebGoC题解(4) 115.第5题 同心圆(比赛模拟题)
    题目描述学校准备在颁奖会把这次比赛的前10名的成绩用崭新的形状表示出来,这个艰巨的任务交给了小C。为了和以往不同,小C决定用每个学生的成绩作为半径画同心圆来表示。这个创新的举动需要你使用GoC编程,在一个黑色实心圆背景下,用10个红色圆表示成绩。具体形状参见输入输出样例......
  • C++内联函数、内联函数的概念、内联函数的特性、auto关键字、类型名字的问题、auto使
    文章目录前言一、内联函数1.内联函数概念2.内联函数特性二、auto关键字(C++11)1.类型名字的问题2.auto简介3.auto的使用细则1.auto与指针和引用结合起来用2.auto在同一行定义多个变量4.auto不能推导的场景1.auto不能作为函数的参数2.auto不能直接用来声明数组3......
  • 11.NiO多线程优化
    场景单线程配合一个selector选择器管理多个channel上的事件。问题1.多核cpu,如果是单线程就会让cpu的力量被浪费。2.单线程处理多个事件,如果某个事件耗费时间比较久,就会影响其它事件的处理。例如:redis单线程写的,底层网络用的类似于nio和selector方式编写,所以缺点就是某个......
  • 读取超7100MB/s最高仅51度的长江存储PC411 SSD!雷神MIX PRO迷你机评测
    一、前言:搭载长江存储SSD和酷睿Ultra5125H处理器的雷神迷你机英特尔酷睿Ultra系列移动处理器发布半年之后,搭载它的各路迷你主机陆续出现在消费者面前。最近,雷神带来了全新的MIXPro迷你机,它就搭载了酷睿Ultra5125H处理器,还有广受好评的长江存储PC411SSD。先说SSD!现在我......
  • 【C++】C++11新特性
    C++11是C++程序设计语言标准的一个新的版本,在2011年由ISO批准并发布。C++11新标准从而代替了原来的C++98和C++03.。C++11标准是对C++的一次巨大的改进和扩充。在核心语法,STL标准模板等方面增加众多新功能。例如新增auto,deltype,nullptr等关键字,增加范围for......
  • ASP.NET Core应用程序11:使用模型绑定
      模型绑定是使用从HTTP请求获得的数据值,创建操作方法和页面处理程序所需的对象的过程。本章描述模型绑定系统的工作方式;显示它如何绑定简单类型、复杂类型和集合;并演示如何控制流程,以指定请求的哪一部分提供应用程序所需的数据值。  本章介绍了模型绑定特性,展示了如何使......
  • CC2500和CC1101移植说明
    主要通过如何移植、移植注意、关于芯片配置、如何生成导出配置四大步骤来说明CC2500和CC1101移植首先通过下图1这个宏进行选择 &如何移植要移植的部分在CC2500_hal.c和CC2500_hal.h中, 搜索"//移植"就可以定位到库所需的依赖,需要根据您的环境实现这些函数&移植......
  • 4-字符串-11-反转字符串-LeetCode344
    4-字符串-11-反转字符串-LeetCode344LeetCode:题目序号344更多内容欢迎关注我(持续更新中,欢迎Star✨)Github:CodeZeng1998/Java-Developer-Work-Note技术公众号:CodeZeng1998(纯纯技术文)生活公众号:好锅(Lifeismorethancode)CSDN:CodeZeng1998其他平台:CodeZeng1998、......
  • DreamJudge-1177-查找学生信息
    1.题目描述TimeLimit:1000msMemoryLimit:32768mb“臭味相投”——这是我们描述朋友时喜欢用的词汇。两个人是朋友通常意味着他们存在着许多共同的兴趣。然而作为一个宅男,你发现自己与他人相互了解的机会并不太多。幸运的是,你意外得到了一份北大图书馆的图书借阅记录,于......
  • 116. 小欧的卡牌(卡码网周赛第十七期(23年oppo提前批B组笔试真题))
    116.小欧的卡牌(卡码网周赛第十七期(23年oppo提前批B组笔试真题))题目描述小欧有n张卡牌,第i张卡牌的正面写了个数字ai,背面写了个数字bi。小欧对于每张卡牌可以选择一面向上,她希望最终向上的数字之和为3的倍数。你能告诉小欧有多少方案吗?由于答案过大,请对10^9+7......