现代C++实践100练:为什么使用nullptr代替NULL?因为它更加风骚

YOLOv8改进 | 融合篇,YOLOv8改进主干网络为MobileNetV3+CA注意机制+添加小目标检测层(全网独家首发,实现极限涨点) 小目标检测难点众多,导致很多算法对小目标的检测效果远不如大中型目标。影响算法性能的主要原因如下:第一,小目标分辨率低、信息量不足,导致神经网络提取到的有效特征较少。第二,小目标在图像中所占的区域较小,易受背景干扰,这对算法的定位性能要求较高。第三,小物体标注困难,训练数据有限,导致模型泛化能力差。例如多尺度学习、无锚机制和生成对抗学习等方法,都能提高小目标检测的准确性和鲁棒性。为了改善小目标漏检现象严重的问题,我在 YOLOv8 中增加了 P2 检测头,相当于有四个检测头,使网络能检测到更小的目标。 阅读详情

在讲这个问题之前,我想先说下本文的风格,这也是我写作的风格,通常我不会像教科书一般上来就直说概念和道理,我喜欢用已知,大家可以理解的问题去引入一个知识,这是我自己的学习方法,也希望介绍给大家。

例如本文,很多人可能不知道nullptr,也不知道为什么要引入它,但是大家都知道NULL,通过NULL引入,就往往容易接受的多。

现代C++实践100练:为什么使用nullptr代替NULL?因为它更加风骚

本文你可以得到什么

你可以知道一个极其好用没用难度的新特性 nullptr

你可以知道为什么C++要用nullptr代替NULL

你可以在以后的编程中使用更加风骚的nullptr

(本文面向小白,大佬勿喷)

问题叙述

之前,我们对指针进行初始化的时候往往使用NULL,在当时看来那并没有问题!

void* ptr =NULL;

但是在某种意义上来说,传统 C++ 会把 NULL、0 视为同一种东 西,这取决于编译器如何定义 NULL,有些编译器会将 NULL 定义为 ((void*)0),有些则会直接将其定义 为 0。

那么这样会出现什么问题呢?

没有了 void * 隐式转换的 C++ 只好将 NULL 定义为 0。而这依然会产生新的问题,将 NULL 定义 成 0 将导致 C++ 中重载特性发生混乱。考虑下面这两个函数:

void Function(char *);
void Function(int);

此时如果编译器将NULL定义为0,那么根据重载的特性,Function(NULL)将调用void Function(int);

这明显是不符合道理的!

所以nullptr横空出世,使用它没有什么阵痛,成为了我最喜欢用的新特性。

nullptr

C++11 引入了 nullptr 关键字,专门用来区分空指针、0。而 nullptr 的类型 为 nullptr_t,能够隐式的转换为任何指针或成员指针的类型,也能和他们进行相等或者不等的比较。

代码示例

#include<iostream>



void Function(char *)
{
	std::cout << "Function(char*) is called" << std::endl;
}
void Function(int i)
{
	std::cout << "Function(int) is called" << std::endl;
}

void main()
{
	/***************************************/
	//验证编译器将null定位为0还是(void*)0
	/***************************************/
	if (std::is_same<decltype(NULL), decltype(0)>::value)
	{
		std::cout << "NULL == 0" << std::endl;
	}
	if (std::is_same<decltype(NULL), decltype((void*)0)>::value)
	{
		std::cout << "NULL == (void *)0" << std::endl;
	}
	if (std::is_same<decltype(NULL), std::nullptr_t>::value)
	{
		std::cout << "NULL == nullptr" << std::endl;
	}
		
	Function(0);		// 调用 Function(int)
	Function(NULL);		//调用 Function(int)
	Function(nullptr);	// 调用 Function(char*)
}


结论

请直接在给指针初始化空的时候,直接使用nullptr!
本文的代码地址:Modern_Cpp_Practice.
代码持续更新,欢迎下载测试,喜欢的给个star!
本系列将长期更新,希望对您有帮助,本文的代码风格参考Google代码风格,希望对您有借鉴!

第6章: MMU Notifier在KVM虚拟化中的应用 本文分析了KVM如何利用MMU Notifier机制维护客户机与宿主机地址映射一致性。KVM采用三层地址空间转换架构(GVA→GPA→HPA),通过硬件辅助虚拟化(EPT/NPT)实现高效转换。重点探讨了KVM MMU Notifier回调实现,包括invalidate_range_start/end等核心函数,以及HVA范围处理流程。当宿主机内存变化时,KVM通过注册的notifier回调及时更新映射关系,确保虚拟化环境的内存一致性。文章详细解析了相关数据结构和关键代码实现,揭示了KVM内存管理的核心机制 阅读详情

相关推荐

Frida实战:高效dump Android内存中的so文件与修复技巧

本文详细介绍了使用Frida工具dump Android内存中已解密so文件的实战技巧。针对加固应用静态分析失效的痛点,文章提供了从环境搭建、使用frida_dump脚本自动化抓取内存数据,到利用SoFixer工具修复ELF文件结构的完整流程,帮助逆向分析人员高效获取可分析的so文件。

tt34567的博客 529

c++标准中为什么要用nullptr代替NULL

用于表示空指针常量。相比于旧标准中使用的宏定义。,是一个与所有指针类型不兼容的类型,这意味着。在 C++11 中引入了新的关键字。更广泛的使用:在旧标准中,NULL。更加安全:在某些情况下,NULL。,避免了一些潜在的问题。,会带来一些问题,例如。

qq_58158950的博客 460

保姆级教程:用WorkVisual 6.0给你的KUKA机器人硬件做一次‘全身体检’与配置检查

本文详细介绍了如何使用WorkVisual 6.0对KUKA机器人进行全面的硬件诊断与配置检查。从环境准备到核心硬件模块检查,再到安全系统合规性验证,提供了保姆级教程,帮助技术团队快速掌握数字化诊断方案,提升工业机器人的健康管理效率。

weixin_27298377的博客 277

C++空指针使用nullptr代替NULL

C++空指针使用nullptr代替NULL - 算法集市的文章 - 知乎 https://zhuanlan.zhihu.com/p/164899234 C/C++中,为了避免野指针(即指针没有指向任何地址)的出现,声明一个指针后,最好马上对其进行初始化。 如果暂时不明确指针指向哪个变量,则可以赋予NULL,如: int* p = NULL; 除了NULL之外,C++11新标准引入了nullptr来表示一个空指针。 nullptr 既不是整型类型,也不是指针类型,nullptr 的类型是 std

salmonwilliam的博客 866

01-SA8155 QNX 虚拟机Hypervisor

Hypervisor运行在Host OS操作系统上,其他操作系统均在Hypervisor上运行。:Hypervisor直接运行在硬件上,操作系统在Hypervisor之上运行。终止(关闭):echo control 0 dev/vmm。路径:qnx_ap/AMSS/platform/vm/resources/关闭/终止 qvm(GVM):slay -s SIGQUIT qvm。", //host PVM --- 主机。不直接操作/dev/vmm 实现关闭,启动vm。

静虚待令,有物混成 1万+

智能车实战——极速越野组GPS与惯导融合定位导航全解析

本文深入解析了智能车极速越野组中GPS与惯导模块的融合定位导航技术。通过对比GPS的全局定位与惯导的高频姿态感知,详细阐述了如何利用MM32SPN27主控,将两者数据融合以实现精准、实时的车辆控制。内容涵盖硬件选型、软件数据处理、PID控制及系统调试等实战环节,为智能车开发者提供了一套完整的解决方案。

pz8901234的博客 1204

使用nullptr代替0或者NULL(effective Modern C++ Item 8)

理由一:使用nullptr代替0或者NULL可以避免重载函数的意外事件,例如 void fun(int a) { std::cout << "int"; } void fun(void* ptv) { std::cout << "void*"; } int main() { fun(0); fun(NULL); fun(nullptr); } 输出结果 可以看出nullptr没有整数类型,而NULL拥有整数类型,导致调用了第一个函数,使用nullptr可以...

qq_42092173的博客 1359

spring-ai学习(四)-MCP

创建一个springai项目1.依赖。

zql1455890112的博客 1386

C++ 中为什么要使用 nullptr 而不是 NULL?

在 C++ 中,使用nullptr而不是NULLnullptr是一个字面量,其类型是。它专门用于表示空指针,而NULL通常被定义为一个宏,其值为0或-1(取决于平台),并且其类型是int或long。使用nullptr可以避免将整数与指针混淆,从而提高类型安全性。nullptr是 C++11 引入的新特性,它与 C++ 的类型系统兼容。使用nullptr可以确保代码在不同的编译器和平台上保持一致的行为。:当函数重载时,使用nullptr可以提供更好的重载解析。

m0_63331248的博客 499

【教程4>第2章>第18节】 GMSK调制系统的FPGA开发与matlab对比验证

GMSK(高斯最小频移键控)是一种连续相位的频移键控(CPFSK)调制方法,它在数字通信中得到了广泛应用,特别是在移动通信系统中。GMSK通过限制频率偏差的累积来减少带外辐射,并通过使用高斯滤波器对。

FPGA/MATLAB学习教程/源码/项目合作开发 998

基于STM32+ESP8266+手机APP的心率血氧温湿度监测报警系统设计(项目资料ID:18)

基于 STM32 微控制器、ESP8266 无线模块和 QT 手机 APP 的多参数监测报警系统。该系统可实时采集心率、血氧饱和度、环境温湿度等参数,通过 OLED 显示屏本地显示,并通过 WiFi 模块上传至手机 APP 实现远程监测与数据可视化。系统具备报警阈值自定义功能,当参数超出设定范围时,通过蜂鸣器和 LED 进行声光报警。系统以 STM32F103 为控制核心,采用 MAX30102 传感器采集心率和血氧,DHT20 采集温湿度,通过 ESP8266 实现无线通信,配合 QT 开发的手机 APP

以培养嵌入式工程师为己任 1万+

C++为什么要使用nullptr代替NULL

1.什么是空指针 空指针就是void* 2.为什么使用NULL表示空指针 C++中NULL定义为0: #define NULL 0 在C++中void*不能隐式转换为其他类型,所以使用0(即NULL)代替控制指针。 为了说明NULL代替空指针存在的问题,下面看一个例子: #include <iostream> void go(int num) { std::...

haimianjie2012的专栏 1935

dify upload存在SSRF漏洞

Dify 是一个用于构建 AI 应用程序的开源平台。

nnn2188185的博客 1481

在c++中为什么我们需要nullptr来取代NULL或者0?

最近发现很多同学在c++中表示空指针都习惯为NULL或者0,这并不是一种优良的习惯 一.在c++中,0和NULL是什么? 字符串常量0的类型是int,并非指针,当c++在只能使用指针的语境中发现了一个0,c++也会勉强的解释为一个空指针,但说到底,在c++中0的类型还是int. 再来谈谈NULL,因为c++标准允许各个实现给予NULL非int的整形类型,但是这并不重要,重要的是NULL并不具备指...

dream0130__的博客 613

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

c++为什么要搞一个nullptr代替NULL表示空指针?

空指针nullptr c中使用NULL代表空指针以及数字0的,能够为什么c++中又要多出来nullptr来表示空指针,难道仅仅就是为了和c语言做一个区分(yay:我不是你,我比你高级!)?

四库全书的酷 776

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

解读:为什么C++使用nullptr而非NULL

为什么C++引入了nullptr,废弃了NULL?

geek! 1483

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

史上最明白的 NULL、0、nullptr 区别分析(老师讲N篇都没讲明白的东东),今天终于明白了,如果和我一样以前不明白的可以好好的看看......

C的NULL 在C语言中,我们使用NULL表示空指针,也就是我们可以写如下代码: int *i = NULL; foo_t *f = NULL; 实际上在C语言中,NULL通常被定义为如下: #define NULL ((void *)0) 也就是说NULL实际上是一个void *的指针,然后吧void *指针赋值给int *和foo_t *的指针的时候,隐式转换成相应...

weixin_34372728的博客 4181

Function.apply.bind(foo,null)解析

前言 前些天看到遇到Function.apply.bind(foo,null)这么一行代码,冥思苦想而不得,终于今日下了决心把它解决掉。 内容 一、要理解这行代码,当然首先得理解apply和bind的相关特性了。 apply:调用一个函数, 其具有一个指定的this值,以及作为一个数组(或类似数组的对象)提供的参数。详情见这里 bind:函数会创建一个新函数(称为绑定函数),新函数与

极简 1618

javascript 处理null及'null'值 (转载)

function dealNull(obj){    for(var i in obj){        if(null == obj[i] || 'null' == obj[i]){            obj[i]='';        }else if('object' == typeof obj[i]){            dealNull(obj[i]);        }   ...

一路前行 1537

C++中NULL和nullptr的区别

一、C程序中的NULL 在C语言中,NULL通常被定义为:#define NULL ((void *)0) 所以说NULL实际上是一个空指针,如果在C语言中写入以下代码,编译是没有问题的,因为在C语言中把空指针赋给int和char指针的时候,发生了隐式类型转换,把void指针转换成了相应类型的指针。 int *pi = NULL; char *pc = NULL; 二、C++程序中的NU...

reason的博客 2万+

php function 传递null,函数参数NULL问题

一个数据连接初始化的代码,本人之前学C#的,就是构造函数里的$dbo=NULL这个看不懂,请指教。我可不可以不要=NULL呢,直接用$dbo,我个人理解是$dbo=NULL这条语句就表示$dbo不是object类型了,那它下面为什么还要去判断? $dbo=NULL这个NULL值不会带到函数里面去吗?protected function __construct($dbo){//...}class D...

weixin_35401836的博客 969

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 254

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 349

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 394

跟我学c++中级篇—类型定义的方式

本文系统阐述了编程中类型定义的重要性及c++中的实现方式。重点对比了宏定义、typedef与modern using三种机制,指出using在可读性、灵活性和模板支持上的优势,推荐优先使用。同时提醒开发者注意别名滥用、类型歧义、错误信息冗长等问题,强调统一规范与合理设计。最终结论:在现代c++开发中,应以using为主,兼顾简洁性与可维护性,避免陷入命名混乱与编译困境。

fpcc的专栏 88

【C++——类和对象(上)】筑基篇:以封装奠定面向对象之基

本文系统梳理C++类与对象的核心知识点,涵盖类的定义、访问限定符(public/private)、类作用域、对象实例化及内存布局。重点解析封装思想、this指针机制、空类大小为1字节的原因,以及类与对象在内存中的存储差异。通过对比C语言结构体与C++类,揭示面向对象设计的优势:数据保护、接口统一、命名隔离与代码可维护性提升。内容由浅入深,适合作为学习笔记与复习参考。

2602_95684935的博客 489
上一篇: 一文带你弄懂Visual Studio:运行时库及MT/MTD、MD/MDD
下一篇: 现代C++实践100练:吃透C++新特性constexpr
CodeBowl
博客等级 码龄5年 7664粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值