さらにコードで、オブジェクトがnull /空かどうかを確認します。
オブジェクトをnullに設定する方法はありますか?
クラスのオブジェクトをNULLに設定することはできません。ただし、ポインタ(オブジェクトのメモリアドレスを含む)をNULLに設定できます。
あなたが求めていることができないことの例:
Cat c;
c = NULL;//Compiling error
できることの例:
Cat c;
//Set p to hold the memory address of the object c
Cat *p = &c;
//Set p to hold NULL
p = NULL;
C++ではオブジェクトを「空/ヌル」にできないことは事実ですが、C++ 17では std::optional
はその意図を表します。
使用例:
std::optional<int> v1; // "empty" int
std::optional<int> v2(3); // Not empty, "contains a 3"
次に、optional
に値が含まれているかどうかを確認できます。
v1.has_value(); // false
または
if(v2) {
// You get here if v2 is not empty
}
ただし、プレーンint
(または任意のタイプ)は、有用な意味で「null」または「empty」(これらの単語の定義により)になることはありません。のことを考える std::optional
これに関するコンテナとして。
手元にC++ 17準拠のコンパイラがない場合は、代わりに boost.optional を使用できます。一部のC++ 17以前のコンパイラは、std::experimental::optional
、少なくとも実際のstd::optional
私の知る限り。詳細については、コンパイラのマニュアルを確認してください。
オブジェクトがNULL /空かどうかを確認します。 NULLと空であることは同じではありません。ジャスティンとブライアンがすでに言及したように、C++ではNULLは通常ポインターに関連付ける割り当てです。おそらくoperator =をオーバーロードできますが、実際にこれを実行したい場合は、十分に検討してください。その他のいくつか:
bool IsEmpty()
メソッドがないのはなぜですか? NULLの使用をバイパスする可能性があると思います。A* p = new A; ... p = NULL;
は、コードがガベージコレクションされることを保証できない限り、悪い(delete pなし)です。どちらかといえば、これはメモリリークにつながり、そのようなリークがいくつかあると、コードが遅くなる可能性が高くなります。class Null {}; Null _NULL;
その後、状況に応じて他のクラスのoperator =およびoperator!=をオーバーロードします。おそらく、オプション4の改善に役立つように、コンテキストに関する詳細を投稿してください。
アルパン
NULL
はC++で単に0として定義されていますが、NULL
へのポインターを設定できます。
myObject *foo = NULL;
また、標準ヘッダーを含める場合はNULL
が定義されますが、言語自体には組み込まれないことに注意してください。 NULL
が未定義の場合、代わりに0を使用するか、これを含めることができます。
#ifndef NULL
#define NULL 0
#endif
余談ですが、ポインタではなくオブジェクトをNULL
に設定したい場合は、 Null Object Pattern について読むことができます。
どのタイプの「オブジェクト」?
NULL
(およびnullptr
)をポインタ型のオブジェクトに確実に割り当てることができます。NULL
を算術型のオブジェクトに割り当てることができる場合は、実装定義です。
何らかのクラスタイプのオブジェクトを意味する場合、答えは[〜#〜] no [〜#〜]です(operator=
がポインターまたは算術タイプを受け入れるクラスを除く)
多くのタイプにはコピーの割り当てとデフォルトの構築の両方があるため(多くの場合暗黙的に)、「空」がより妥当です。 既存のオブジェクトがデフォルトで構築されたものに似ているかどうかを確認するには、適切なbool operator==
も必要です