C++11新特性之四——nullptr
1. 引入nullptr的原因
引入nullptr的原因,这个要从NULL说起。对于C和C++程序员来说,一定不会对NULL感到陌生。但是C和C++中的NULL却不等价。NULL表示指针不指向任何对象,但是问题在于,NULL不是关键字,而只是一个宏定义(macro)。
1.1 NULL在C中的定义
在C中,习惯将NULL定义为void*指针值0:
#define NULL (void*)0
但同时,也允许将NULL定义为整常数0。
1.2 NULL在C++中的定义
在C++中,NULL却被明确定义为整常数0:
// lmcons.h中定义NULL的源码
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
1.3为什么C++在NULL上选择不完全兼容C?
根本原因和C++的重载函数有关。C++通过搜索匹配参数的机制,试图找到最佳匹配(best-match)的函数,而如果继续支持void*的隐式类型转换,则会带来语义二义性(syntax ambiguous)的问题。
// 考虑下面两个重载函数
void foo(int i);
void foo(char* p) foo(NULL); // which is called?
2. nullptr的应用场景
2.1 编译器
如果我们的编译器是支持nullptr的话,那么我们应该直接使用nullptr来替代NULL的宏定义。正常使用过程中他们是完全等价的。对于编译器,Visual Studio 2010已经开始支持C++0x中的大部分特性,自然包括nullptr。而VS2010之前的版本,都不支持此关键字。Codeblocks10.5附带的G++ 4.4.1不支持nullptr,升级为4.6.1后可支持nullptr(需开启-std=c++0x编译选项)
2.2 使用方法
0(NULL)和nullptr可以交换使用,如下示例:
int* p1 = ;
int* p2 = nullptr; if(p1 == ) {}
if(p2 == ) {}
if(p1 == nullptr) {}
if(p2 == nullptr) {}
if(p1 == p2) {}
if(p2) {}
不能将nullptr赋值给整形,如下示例:
int n1 = ; // ok
int n2 = nullptr; // error if(n1 == nullptr) {} // error
if(n2 == nullptr) {} // error
if(nullprt) {} // error
nullptr = // error
上面提到的重载问题,使用nullptr时,将调用char*。
void foo(int) {cout << "int" << endl;}
void foo(char*) {cout << "pointer" << endl;} foo(); // calls foo(int)
foo(nullptr); // calls foo(char*)
3.模拟nullptr的实现
某些编译器不支持c++11的新关键字nullptr,我们也可以模拟实现一个nullptr。
const
class nullptr_t_t
{
public:
template<class T> operator T*() const {return ;}
template<class C, class T> operator T C::*() const { return ; }
private:
void operator& () const;
} nullptr_t = {};
#undef NULL
#define NULL nullptr_t
【转自】http://blog.csdn.net/huang_xw/article/details/8764346
C++11新特性之四——nullptr的更多相关文章
- 【C++11新特性】 nullptr关键字
原文链接:http://blog.csdn.net/xiejingfa/article/details/50478512 熟悉C++的童鞋都知道,为了避免“野指针”(即指针在首次使用之前没有进行初始化 ...
- c++11新特性之nullptr
在c++11中,nullptr可完全代替NULL. 然而NULL和nullptr还是稍有不同,NULL可被转化为int类型,而nullptr不能.因此nullptr对NULL在进行模板推导或者函数重 ...
- C++11新特性总结 (二)
1. 范围for语句 C++11 引入了一种更为简单的for语句,这种for语句可以很方便的遍历容器或其他序列的所有元素 vector<int> vec = {1,2,3,4,5,6}; ...
- C++11新特性总结 (一)
1. 概述 最近在看C++ Primer5 刚好看到一半,总结一下C++11里面确实加了很多新东西,如果没有任何了解,别说自己写了,看别人写的代码估计都会有些吃力.C++ Primer5是学习C++1 ...
- C++ 11 新特性
C++11新特性: 1.auto 2.nullptr 3.for 4.lambda表达式 5.override ...
- [转载] C++11新特性
C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...
- 在C++98基础上学习C++11新特性
自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...
- c++学习书籍推荐《深入理解C++11 C++11新特性解析与应用》下载
百度云及其他网盘下载地址:点我 编辑推荐 <深入理解C++11:C++11新特性解析与应用>编辑推荐:C++标准委员会成员和IBM XL编译器中国开发团队共同撰写,权威性毋庸置疑.系统.深 ...
- c++ 11 线程池---完全使用c++ 11新特性
前言: 目前网上的c++线程池资源多是使用老版本或者使用系统接口实现,使用c++ 11新特性的不多,最近研究了一下,实现一个简单版本,可实现任意任意参数函数的调用以及获得返回值. 0 前置知识 首先介 ...
随机推荐
- 利用IT++搭建通信仿真平台
IT++ is a C++ library of mathematical, signal processing and communication classes and functions.也就是 ...
- JAVA 监控工具 VisualVM 插件路径配置地址
在使用VisualVM监控工具的时候,发现无法安装或者更新插件,或者报错,最后发现原来是插件中心的URL地址原装地址就不对.根据官方网站的地址配置后就正常了.下面的具体地址. VisualVMRele ...
- apt-get install 的替换命令及mysql安装问题的解决
Some packages could not be installed. This may mean that you haverequested an impossible situation o ...
- sed: 1: “…”: invalid command code on Mac OS
昨天因为项目中有很多文件的同一个变量需要批量替换成另一个,想用sed做这个.Linux 这样其实就可以了 ~# sed -i “s/string_old/string_new/g” grep -rl ...
- jquery方法操作iframe元素
操作iframe父元素 $("#rolesCtl",parent.document).find( 'button' ).trigger( 'click' ); 在父页面获取ifra ...
- [Javascript]右侧悬浮框
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- java-上传文件与现实上传文件
项目结构: 项目展示: 数据库: /* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.5.53 : Database - fileupload ********* ...
- 公司内网成功实现WSUS在不连外网的条件下更新补丁包!
微软的WSUS的命令行很有帮助! 为了便于管理,WSUS服务器中提供了一个命令行工具WSUSUtil.exe,你可以使用它完成一些在WSUS管理控制台中不能进行的任务,例如导入导出数据等等.WSUSU ...
- tp-03 模板显示
方式模板:$this->display(); 每当建立一个控制器 都要在view建立一个名字相对应的文件夹 在建立相对于的页面.
- Eclipse使用技巧收集
因为学习Java相关,对Eclipse这个开发工具用的不习惯,许多操作以及快捷键在百度得到解决后下次又忘记了.有时使用VS又混淆了它的快捷键操作.所以写个备忘录持续更新收集平时遇到的操作. 导入项目, ...