美文网首页面试
自己实现一个nullptr(c++)

自己实现一个nullptr(c++)

作者: FreeHale | 来源:发表于2017-04-01 16:12 被阅读254次
一 具体实现

代码(c++)

const class nullptr_t
{
public:
    template<class T>
    inline operator T*() const
        { return 0; }

    template<class C, class T>
    inline operator T C::*() const
        { return 0; }
 
private:
    void operator&() const;
} nullptr = {};

来自维基百科

二 解析
  1. 在vs2013写了如下代码,作为解析演示。
//nullptr.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
const class mynullptr_t
{
public:
    template<class T>
    inline operator T*() const
    {
        cout << "T* is called" << endl;
        return 0;
    }
    template<class C, class T>
    inline operator T C::*() const
    {
        cout << "T C::* is called" << endl;
        return 0;
    }

private:
    void operator&() const;
    
} mynullptr = {};

class A{
public:
      int *a;
};

int main(){

    int *p = mynullptr;
    int A::*a = mynullptr;
    cout << p << endl;
    cout << a << endl;

}

结果输出

T* is called
T C::* is called
00000000
0

2.解释
首先申明了一个类(为了避免冲突我使用了mynullptr_t)使用了const修饰,意味着里面的变量是不能更改的。
同时类里面有两个公有函数如下:

template<class T>
operator T*() const;
template<class C, class T>
operator T C::*() const

其中template<class T>表示模板,意味着,T可以使用户自定义的类型。既然是空指针,那么很多种类型的指针都可以指向它,所以使用了模板。使用了operator关键字,operator表示重载,重载有很多种,在这里此函数为一个隐式转换函数。const表示此函数不修改类的成员变量。如果对这方面不是很清楚可以参考
1.c++模板详解 2.C++ operator两种用法这两篇博客。

在函数里面只做了一件事也就是返回0,为什么返回0呢?因为在对指针赋值时如果指针=0,也即意味着这个指针为一个空指针。原因是因为在<stdio.h>头文件下有以下定义:

/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else  /* __cplusplus */
#define NULL    ((void *)0)
#endif  /* __cplusplus */
#endif  /* NULL */

将NULL 定义为了0;
不信的话可以试一试

int *p = 0;
cout << p << endl;

输出:00000000

第二个函数和上面的一样只是模板不同

template<class C, class T>
    operator T C::*() const
    {
        cout << "C::T* is called" << endl;
        return 0;
    }

目的是为了给类的成员指针变量赋予空指针。所以你可以根据你自己的需求写出各种模板参数。

private中void operator&() const;即为将&符号禁用。因为空指针没有引用这一说。

3.检验测试
在main函数中分别定义了一下变量

int *p = mynullptr;
int A::*c = mynullptr;

int *的指针p并赋予空指针,和以及对类A 的成员指针赋予空指针。
要把mynullptr赋给左边的值,由于右边mynullptr的类型与左边不同,所以此时要进行隐式类型转化,如何转化呢?还记得我们在类中写的那两个函数吗,他们就是隐式转化的函数。根据左边的类型去匹配模板,第一个当然与T*匹配,所以调用第一个隐式转化函数,于是结果打印了T*is called同样的第二个应该调用第二个隐式转换函数,打印了C::T* is called。我们知道空指针的地址为0地址,所以第一个打印了00000000(32位系统指针占4个字节,所以是8个0)。第二个由于是成员指针,代表的是偏移量,所以打印了0。

相关文章

  • 自己实现一个nullptr(c++)

    一 具体实现 代码(c++) 来自维基百科 二 解析 在vs2013写了如下代码,作为解析演示。 结果输出 2.解...

  • C++学习笔记之NULL vs nullptr

    C++学习笔记之NULL vs nullptr

  • C++11/14新特性

    1.nullptr nullptr 出现的目的是为了替代 NULL,传统 C++ 会把 NULL、0 视为同一种东...

  • nullptr(转)

    引入nullptr的原因引入nullptr的原因,这个要从NULL说起。对于C和C++程序员来说,一定不会对NUL...

  • FFmpeg视频播放

    首先记录一下C++中的NULL、0、nullptr的区别 NULL在C++中就是0,这是因为在C++中void* ...

  • C++ 11 语言特性介绍

    C++ 11 语言特性 新特性说明nullptr,autoNAfor-each区间迭代shared_ptr uni...

  • C++的未来和指针

    我对C++思考了很多,有一些内容和指针有关。在C++ 11中只对指针进行了小量的更新(引入了nullptr),不过...

  • C++关于NULL、0、nullptr

    2016-07-17 星期日 天气☀ 01:07:04 一 关于NULL、0、nullptr 1 在C语言中...

  • C++ 理解NULL和nullptr

    考虑以下代码简单的代码,向my函数传递NULL会发生什么问题? 编译无法通过,这里发生什么问题呢?NULL在C中实...

  • NULL和nullptr的使用

    NULL是C 标准库表示空指针的类型,nullptr是C++ stl表示空指针的类型事实上,NULL或是nullp...

网友评论

    本文标题:自己实现一个nullptr(c++)

    本文链接:https://www.haomeiwen.com/subject/mtwiottx.html