• C++11之nullptr



    我们都知道,在写C/C++程序时,一个合格的程序员,总是在书写指针的时候会初始化指针为NULL。这样就避
    免了野指针(悬挂指针)的出现。如果使用了未初始化的指针,那么可能会导致一些难以调试的错误。
    在传统的C语言头文件stddef.h之中,我们可以看到如下代码:
     #ifndef NULL
      #ifdef __cplusplus
      #define NULL 0
      #else
      #define NULL ((void *)0)
      #endif
    可以看到如果是c语言就是NULL就是(void *)0,在C++里就是0。这个时候可能会引发一些问题。大多数的计算机系统并不允许我们对0这个地址进行write和read操作。我们看一个例子:
    #include <iostream>
    
    using std::cout;
    void f(int* p)
    {
    	cout << "int* f
    ";
    }
    
    void f(int a)
    {
    	cout << "int f
    ";
    }
    
    int main(int argc, char** argv)
    {
    	f(12);
    	f(NULL);
    	f((int*) 0);
    }
    输出如下:

    我们看到,NULL作为参数的时候,实际并没有调用指针为形式参数的函数,而是调用了形式参数为int的函数。当我们使用强制转换的时候,没有什么问题。因此,这样的调用可能是违背我们的原意的。所以C++11引入了新的指针空值nullptr。很好的解决了上面出现的违背原意的操作。C++11把nullptr作为一个关键字引入。它本身是“指针空值类型”的一个常量。指针空值常量类型被命名为nullptr_t。我们来看下面的代码:
    #include <iostream>
    
    using std::cout;
    void f(int* p)
    {
    	cout << "int* f
    ";
    }
    
    void f(int a)
    {
    	cout << "int f
    ";
    }
    
    int main(int argc, char** argv)
    {
    	f(nullptr);
    }
    
    这段代码输出如下:


    我们可以看到,它按照我们原本的意思,成功的调用了指针类型的重载函数。
    但是需要注意的是nullptr的地址是不能被用户使用的。

  • 相关阅读:
    存储过程加密
    sql 指删除表,改表名,改字段名
    windows 2003 server 64 位 IIS 6下部署 32位网站
    linux查看内存的使用占比
    linux查看端口是否被占用
    ERROR 2002 (HY000): Can't connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock' (2)
    mysql数据库的备份(mysqldump)和恢复(source)
    linux解压压缩文件zip/tar/tar.gz命令汇总
    oracle数据库的备份和导入数据
    oracle 备份表数据
  • 原文地址:https://www.cnblogs.com/zy666/p/10504354.html
Copyright © 2020-2023  润新知