如何在c ++ 98中定义我们自己的nullptr?

时间:2017-06-13 09:31:40

标签: c++ nullptr

实际上我正在编写自己的所有库类的版本,我不想将STL文件包含到我的类文件中。 因此,例如,我想检查节点是否等于null。 如果我写的话

#define nullptr 0

然后它不能与其他节点指针(即Node *root = nullptr

一起使用

2 个答案:

答案 0 :(得分:6)

书中提到了如何做到这一点:Effective C++, 2nd edition by Scott Meyers(更新版本可用)在章节中:“项目25:避免指针上的重载和数字类型。”。

如果您的编译器不知道C ++ 11引入的nullptr关键字,则需要它。

const                         /* this is a const object...     */
class nullptr_t
{
public:
   template<class T>          /* convertible to any type       */
   operator T*() const        /* of null non-member            */
      { return 0; }           /* pointer...                    */

   template<class C, class T> /* or any type of null           */
      operator T C::*() const /* member pointer...             */
      { return 0; }   

private:
   void operator&() const;    /* Can't take address of nullptr */

} nullptr = {};               /* and whose name is nullptr     */

这本书绝对值得一读。

nullptr优于NULL的优势在于,nullptr就像一个真正的指针类型,因此它增加了类型安全性,而NULL就像一个整数设置为0在预C ++ 11中。

答案 1 :(得分:5)

您不应该定义具有关键字标识符的宏。

即使您不使用STL,也不需要定义自己的nullptr,因为它不是STL(也不是标准库)的一部分,而是(C ++)语言本身的一部分。 / p>