跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++11 nullptr
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:C++11 nullptr}} '''C++11 nullptr''' 是 C++11 标准引入的关键字,用于表示空指针常量,取代传统 C/C++ 中使用的 <code>NULL</code> 或字面量 <code>0</code>。它解决了旧有空指针表示方式带来的类型安全问题和二义性。 == 介绍 == 在 C++11 之前,空指针通常通过宏 <code>NULL</code>(定义为 <code>0</code> 或 <code>((void*)0)</code>)或直接使用 <code>0</code> 表示。这种方式存在以下问题: * '''类型不安全''':<code>NULL</code> 可能被隐式转换为整数类型。 * '''函数重载歧义''':当函数同时重载指针和整数版本时,传递 <code>NULL</code> 可能导致意外调用整数版本。 C++11 引入 <code>nullptr</code> 作为类型安全的空指针常量,其类型为 <code>std::nullptr_t</code>,可隐式转换为任何指针类型,但不会转换为整数类型。 == 语法与用法 == <code>nullptr</code> 的语法非常简单: <syntaxhighlight lang="cpp"> T* ptr = nullptr; // T 为任意类型 </syntaxhighlight> === 代码示例 === 以下示例展示 <code>nullptr</code> 与传统 <code>NULL</code> 的区别: <syntaxhighlight lang="cpp"> #include <iostream> void func(int) { std::cout << "Integer overload\n"; } void func(int*) { std::cout << "Pointer overload\n"; } int main() { func(NULL); // 可能输出 "Integer overload"(取决于 NULL 定义) func(nullptr); // 明确输出 "Pointer overload" return 0; } </syntaxhighlight> '''输出''': <pre> Integer overload Pointer overload </pre> == 类型系统 == <code>nullptr</code> 的类型是 <code>std::nullptr_t</code>,定义在 <code><cstddef></code> 头文件中。该类型可以隐式转换为任何指针类型,包括成员指针。 === 类型关系图 === <mermaid> graph TD A[std::nullptr_t] -->|隐式转换| B[任何指针类型] A -->|隐式转换| C[成员指针类型] D[NULL/0] -->|可能转换| E[整数类型] D -->|可能转换| B </mermaid> == 实际应用场景 == === 场景1:函数重载 === 当需要区分指针和整数参数时,<code>nullptr</code> 能明确选择指针版本: <syntaxhighlight lang="cpp"> void process(int* data) { /* 处理指针 */ } void process(int id) { /* 处理整数 */ } process(0); // 调用 process(int) process(nullptr); // 调用 process(int*) </syntaxhighlight> === 场景2:模板编程 === 在模板中,<code>nullptr</code> 能保持类型信息: <syntaxhighlight lang="cpp"> template<typename T> void check(T* ptr) { if (ptr == nullptr) { std::cout << "Null pointer detected\n"; } } int main() { int* p = nullptr; check(p); // 正确推断类型 } </syntaxhighlight> == 与 NULL 的对比 == {| class="wikitable" |- ! 特性 !! <code>nullptr</code> !! <code>NULL</code> |- | 类型安全 || ✔️ 仅匹配指针类型 || ❌ 可能匹配整数类型 |- | 模板友好 || ✔️ 保留类型信息 || ❌ 丢失类型信息 |- | 可读性 || ✔️ 明确表示空指针 || ❌ 可能是整数或指针 |} == 数学表达 == 在类型系统中,<code>nullptr</code> 的转换可表示为: <math> \text{std::nullptr\_t} \subseteq \text{PointerTypes} </math> == 注意事项 == * 不要混合使用 <code>nullptr</code> 和 <code>NULL</code>,建议完全迁移到 <code>nullptr</code>。 * <code>nullptr</code> 不能用于算术运算(如 <code>nullptr + 1</code>)。 * 在 C++14 后,<code>nullptr</code> 还可用于 <code>constexpr</code> 上下文。 == 总结 == <code>nullptr</code> 是 C++11 引入的关键改进,提供了类型安全的空指针表示方式。它消除了传统 <code>NULL</code> 的二义性,尤其在函数重载和模板编程中表现优异。建议所有新代码优先使用 <code>nullptr</code>。 [[Category:C++11新特性]] [[Category:指针相关概念]] [[Category:编程语言]] [[Category:C++]] [[Category:C++11 新特性]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)