[C++] nullptr C++ の Null ポインター (C++11)

序文

通常、C/C++ コードを記述するときに、NULL ポインターを表すために NULL を使用する人や、NULL ポインターを表すために nullptr を使用する人がいます。これらがすべて NULL ポインターであるかどうか知りたいと思うかもしれません。NULL ポインタを記述する方法が 2 つあるのはなぜですか? 以下では、この背後にある原理を理解していきます。

NULL が C 言語の null ポインタであることは誰もが知っています。C++ は、ほとんどの条件下で C と互換性があります。C++98 および以前の null ポインタも NULL で表されますが、C++11 の新機能では、nullptr を使用します。ポインタの null 値を表し、NULL は 0 のみを表します。


1. C/C++ における NULL の定義と実装

C 言語における NULL の定義は一般的に次のとおりです。

#define NULL (void*)0 

しかし同時に、NULL を整数定数 0 として定義することもできます。

C++11 における NULL の定義は次のとおりです。

#ifndef NULL
#ifdef __cplusplus //如果是C++文件,那么都会有 __cplusplus 标志
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

このコードを翻訳すると、C 言語の場合、NULL は次のように定義されます。

#define NULL ((void *)0)

C++ では、NULL は次のように定義されます。

#define NULL 0

2. nullptr を導入するために C++11 を導入する理由

この質問に答えるために、まずコードの一部を見てみましょう

#include<iostream>
using namespace std;
void f(int)
{
    
    
	cout << "f(int)" << endl;
}
void f(int*)
{
    
    
	cout << "f(int*)" << endl;
}
int main()
{
    
    
	f(0);
	f(NULL);
	f((int*)NULL);
	return 0;
}

ここに画像の説明を挿入
コードの 2 行目が C++98 標準に準拠している場合、通常の考え方では、f(0) には void f (int) と f(NULL) が入るはずであることがわかりました。 void f(int*) を入力する必要があるため、必要な結果は
f(int)
f(int*)
f(int*)をそれぞれ出力することです
。その理由は、C++98では整数または型なしのポインター (void ) 定数ですが、コンパイラーはデフォルトでこれを整数定数として扱います。ポインターとして使用したい場合は、 (void ) 0 にキャストする必要があります

上記の問題を回避するために、C++11 ではポインタの null 値を表す nullptr キーワードが導入されました。NULL は 0 のみを意味します。

知らせ:

  1. nullptr を使用してポインターの null 値を表す場合、nullptr は C++11 で新しいキーワードとして導入されたため、ヘッダー ファイルをインクルードする必要はありません。
  2. C++11 では、sizeof(nullptr) と sizeof((void )0) は同じバイト数を占めます。*
  3. コードの堅牢性を向上させるために、後でポインターの null 値を表すときに nullptr を使用することをお勧めします。
    比較

おすすめ

転載: blog.csdn.net/qq_65207641/article/details/128925654