7.1 C++11指针空值—nullptr

一、NULL和nullptr区别

  1. NULL是宏定义,nullptr是关键字。
#ifndef NULL#ifdef __cplusplus#define NULL 0#else#define NULL ((void *)0)#endif
#endif
  1. nullptr可以隐式转换为任意指针类型,而NULL需要显示转换
void func(char *)
{std::cout << "char * func" << std::endl;
}
void func(int)
{std::cout << "int func" << std::endl;
}int main()
{//NULL;	nullptr;func(NULL);					//"int func"func((char *)NULL);	//"char * func"func(nullptr);			//"char * func"}
  1. NULL可以进行算数运算,nullptr不行
std::cout << NULL + 1 << std::endl;					//1//std::cout << nullptr + 1 << std::endl;	//编译器报错
  1. 比较运算也有区别,nullptr可以与任意指针或nullptr_t类型以及0比较(非0整数不允许),而NULL可以与整数和指针比较。
	int *a = new int(4);if (nullptr < a)std::cout << "nullptr < a" << std::endl;if (NULL < a)std::cout << "NULL < a" << std::endl;

二、NULL和nullptr相同点

  1. 两者都不能取地址,但是nullptr_t类型的变量可以取地址。
  2. 两者的大小相等,且与平台相关。
  3. 两者都能与指针和0的比较。
std::cout << sizeof(NULL)<< sizeof(nullptr)<<"\n"<<(0==NULL) << (0==nullptr)<<std::endl;	//8,8,true,true
if (nullptr==0)std::cout << "nullptr\n"<<std::endl;				//nullptr

三、nullptr与nullptr_t的特性

  1. nullptr_t类型是由nullptr获取的
typedef decltype(nullptr) nullptr_t;
  1. 所有nullptr_t类型的变量行为都与nullptr等价,行为也一样
  2. 都能隐式转换为任意指针
  3. 不能转为非指针类型,即使reinterpret_cast<nullptr_t>()也不行。(实际上可以转为bool)
  4. 不能进行算术运算,
  5. 能进行关系运算,支持nullptr_t类型和指针类型,以及0,其他整数都不行
  6. 是类型,所以模板时不支持推导成T *
        using namespace std;template<typename T> void g(T* t) {}template<typename T> void h(T t) {}int main(){g(nullptr);              // 编译失败, nullptr的类型是nullptr_t,而不是指针g((float*) nullptr);    // 推导出T = floath(0);                      // 推导出T = inth(nullptr);              // 推导出T = nullptr_th((float*)nullptr);     // 推导出T = float*}// 编译选项:g++ 7-1-4.cpp -std=c++11

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/206650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java安全之Commons Collections6分析

CC6分析 import org.apache.commons.collections.*; import org.apache.commons.collections.functors.ChainedTransformer; import org.apache.commons.collections.functors.ConstantTransformer; import org.apache.commons.collections.functors.InvokerTransformer; impo…

Flask 动态路由、请求数据接收、视图函数返回值详解

一、动态路由 在前面的博客中&#xff0c;我们学习了如何创建基本的 Flask 应用&#xff0c;并定义了一些简单的路由。但有时候&#xff0c;我们需要更加灵活的路由&#xff0c;能够根据用户请求的不同来动态生成响应。Flask 提供了动态路由的功能&#xff0c;使我们能够轻松处…

上网监控软件——安全与隐私的平衡

网络已经成为人们生活和工作中不可或缺的一部分。然而&#xff0c;随着网络使用的普及&#xff0c;网络安全问题也日益突出。上网监控软件作为网络安全领域的一个重要组成部分&#xff0c;在保护企业和家庭网络安全方面发挥着重要作用。 本文将探讨上网监控软件的背景、功能、优…

我的Android播放器封装经验

近段时间&#xff0c;电视家不能用了&#xff0c;好吧&#xff0c;自己开发一个APP。其实也不是开发&#xff0c;而是基于现有的播放器核心自己封装一个&#xff0c;只要能够非常方便操作观看电视就好。 当然&#xff0c;前提是要有节目源&#xff0c;这个我早已完成&#xff…

1-2算法基础-常用库函数

1.排序 sort(first,last,cmp) first指向要排序范围的第一个元素&#xff0c;从0起 last指向要排序范围的最后一个元素的下一个位置 cmp&#xff08;可选&#xff09;&#xff0c;自定义函数&#xff0c;默认从小到大 评测系统 #include <iostream> #include<algorith…

Java一对一聊天

服务端 package 一对一用户;import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Vector;…

three.js 入门三:buffergeometry贴图属性(position、index和uvs)

环境&#xff1a; three.js 0.159.0 一、基础知识 geometry&#xff1a;决定物体的几何形状、轮廓&#xff1b;material&#xff1a;决定物体呈现的色彩、光影特性、贴图皮肤&#xff1b;mesh&#xff1a;场景中的物体&#xff0c;由geometry和materia组成&#xff1b;textu…

十五、机器学习进阶知识:K-Means聚类算法

文章目录 1、聚类概述2、K-Means聚类算法原理3、K-Means聚类实现3.1 基于SKlearn实现K-Means聚类3.2 自编写方式实现K-Means聚类 4、算法不足与解决思路4.1 存在的问题4.2 常见K值确定方法4.3 算法评估优化思路 1、聚类概述 聚类&#xff08;Clustering&#xff09;是指将不同…

浅谈WPF之控件拖拽与拖动

使用过office的visio软件画图的小伙伴都知道&#xff0c;画图软件分为两部分&#xff0c;左侧图形库&#xff0c;存放各种图标&#xff0c;右侧是一个画布&#xff0c;将左侧图形库的图标控件拖拽到右侧画布&#xff0c;就会生成一个新的控件&#xff0c;并且可以自由拖动。那如…

Python---面向对象其他特性

1、类属性 Python中&#xff0c;属性可以分为实例属性和类属性。 类属性就是 类对象中定义的属性&#xff0c;它被该类的所有实例对象所共有。通常用来记录 与这类相关 的特征&#xff0c;类属性 不会用于记录 具体对象的特征。 在Python中&#xff0c;一切皆对象。类也是一…

1 接口测试介绍

在软件测试工作中&#xff0c;接口测试是必不可少的。接口测试一般是发生在单元测试之后&#xff0c;系统测试之前。当开发人员输出API文档后&#xff0c;测试人员就可以开始编写接口测试用例了。接口测试可以让测试人员更早的介入&#xff0c;不需要等待前后端联调完成才开始测…

银行卡二要素API的应用案例:从在线购物到金融投资

引言 随着互联网技术的不断发展&#xff0c;人们的金融需求也在不断增加。随之而来的是各种新型金融服务的涌现&#xff0c;让用户的金融体验更加便利快捷。其中&#xff0c;银行卡二要素API的应用&#xff0c;则为用户的金融体验和安全性提供了极大的保障。 银行卡二要素API…

知识蒸馏的蒸馏损失方法代码总结(包括:基于logits的方法:KLDiv,dist,dkd等,基于中间层提示的方法:)

有两种知识蒸馏方法&#xff1a;一种利用教师模型的输出概率&#xff08;基于logits的方法&#xff09;[15,14,11]&#xff0c;另一种利用教师模型的中间表示&#xff08;基于提示的方法&#xff09;[12,13,18,17]。基于logits的方法利用教师的输出作为辅助信号来训练一个较小的…

VBA语法结构及编程思想

VBA&#xff08;Visual Basic for Applications&#xff09;是一种编程语言&#xff0c;它被用于Microsoft Office应用程序的自动化&#xff0c;允许用户编写宏来执行常规任务。VBA是基于Microsoft的Visual Basic语言&#xff0c;但专为Office应用程序定制。 VBA语法格式 VBA的…

【STM32】TIM定时器输出比较

1 输出比较 1.1 输出比较简介 OC&#xff08;Output Compare&#xff09;输出比较&#xff1b;IC&#xff08;Input Capture&#xff09;输入捕获&#xff1b;CC&#xff08;Capture/Compare&#xff09;输入捕获和输出比较的单元输出比较可以通过比较CNT与CCR寄存器值&#…

JavaWeb-HTTP协议

1. 什么是HTTP协议 HTTP超文本传输协(Hyper Text transfer protocol)&#xff0c;是一种用于用于分布式、协作式和超媒体信息系统的应用层协议。它于1990年提出&#xff0c;经过十几年的使用与发展&#xff0c;得到不断地完善和扩展。HTTP 是为 Web 浏览器与 Web 服务器之间的…

AI自动生成代码工具

AI自动生成代码工具是一种利用人工智能技术来辅助或自动化软件开发过程中的编码任务的工具。这些工具使用机器学习和自然语言处理等技术&#xff0c;根据开发者的需求生成相应的源代码。以下是一些常见的AI自动生成代码工具&#xff0c;希望对大家有所帮助。北京木奇移动技术有…

Redisson的基本使用

Redisson官网描述&#xff1a;Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格客户端&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的 redis 常用数据结构命令服务&#xff0c;还提供了许多分布式服务&#xff0c;例如分布式锁、分布式对象、…

HCIP —— BGP 基础 (上)

BGP --- 边界网关协议 &#xff08;路径矢量协议&#xff09; IGP --- 内部网关协议 --- OSPF RIP ISIS EGP --- 外部网关协议 --- EGP BGP AS --- 自治系统 由单一的组织或者机构独立维护的网络设备以及网络资源的集合。 因 网络范围太大 需 自治 。 为区分不同的AS&#…

vim常见操作

vim常见操作 文章目录 vim常见操作1. 回退/前进2. 搜索3. 删除4. 定位到50行5. 显示行号6. 复制粘贴7. 剪贴8. 替换9. vim打开文件的时候出现 1. 回退/前进 1.esc进入命令模式 2.ctrlr 前进 u 回退2. 搜索 1&#xff09; esc进入命令模式 2&#xff09; /text  查找text&am…