忍者ブログ
[180] [179] [178] [177] [176] [175] [174] [173] [172] [171] [170]

DATE : 2017/06/27 (Tue)
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


DATE : 2006/10/06 (Fri)

C 言語では、ヌルポインタは次のように定義されています。

#define NULL ((void *) 0)

それに対し、C++ では次のように定義されています。

#define NULL 0

C 言語では void 型のポインタだった NULL が、C++ ではただの整数値になっています(コンパイラによって、int 型や long 型に定義されています)。

これは、C++ の型チェックが C 言語と比べて厳しくなったためです。C 言語式では void 型のポインタに型を決定していますが、C++ 式では型を決定付けていません。つまり、C++式の場合は、NULL 値がそのポインタにあった型に自動的に変換されることになります。

(;^ω^)ちなみに、マシンによってはヌルポインタが0番地を指さないものもあります。ただし C や C++ のコンパイラは、ポインタ変数を0で初期化していたり代入、比較しようとしていると、0を自動的にそのマシンに応じたヌルポインタの値に変換してくれます。

しかし、C++ 式では特定の場合に問題が発生します。

次のような関数を考えてみます。

void function(Object* obj) { ... }
void function(int i) { ... }

そこで、次のような呼び出しを考えます。

function(NULL);

Object* を引数にとる関数か、int を引数に取る関数のどちらが呼ばれるかは、コンパイラに依存します。そのため、上のようにポインタと int 型とでオーバーロードするのは推奨されていません。

なお、上の関数を正しく呼び出すには、それぞれの引数の型に NULL をキャストします。

このように、C++ の NULL は特別な値ではなくただの整数値であるために、誤解を招きやすい形になっています。そのため、「NULL」を使わずに「0」とそのまま書くことが推奨されています。

(;^ω^)特に、C 言語 → C++ と勉強してくると勘違いしやすいところですね

ちなみに、将来の C++ の仕様では、ヌルポインタを表す予約語が定義されるそうです。

参考文献

(;^ω^)勉強日記の最後にまとめて書こうかと思ったのですが、かなり多くなりそうなので、それぞれのページに付けていこうと思います。

PR
●この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
●この記事へのトラックバック
この記事にトラックバックする:
忍者ブログ [PR]
ブログ内検索
最近の状況
リンク
カレンダー
05 2017/06 07
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック
T/O
(11/05)
ブログ内検索
最近の状況
リンク
カレンダー
05 2017/06 07
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック
T/O
(11/05)