/ /「=」のオーバーロードと、それを回避できる場合-c ++、演算子オーバーロード

オーバーロードについて "="と私がそれを避けることができる場合 - C + +、演算子のオーバーロード

バイナリ検索ツリーがあり、テンプレートを使用して任意のクラスオブジェクトを追加します。

上記のクラスオブジェクトまたはNULLを返す検索関数があります

このオブジェクトを返すには、「=」をオーバーロードする必要がありますか? 私は、オブジェクトを返すかどうかを確認することを望んでいました:同じタイプがLHSに格納されている値をRHSに格納されている値で置き換え、NULLが最初のオブジェクトをNULLとしてマークする場合。

私の間違いはおそらく他のどこか(私が返すのは完全なオブジェクトまたはNULLのいずれかであり、他には何もありません)または実際にそれをオーバーロードする必要がありますか?

時間は非常に限られているため、必要に応じてこれを行うにはどうすればよいですか?そして、それは速いプロセスですか、それとも多くの変更を伴いますか。

コードの不足で申し訳ありませんが、関連するものは考えられません。

EDIT また、多くのNULLを使用するため、オブジェクトにNULLを返すことができますか?例:

class Matrix {
private:
int col;
int line;
int value;
}

Matrix mat; mat = NULL;

いくつかのコード:

template <typename Type>
Type BST<Type>::search(int key) {
if (this->root == NULL)
return NULL;
else
return root->search(key);

ここで、TypeはMatrixです。 NULLを返すか、検索に進んでTypeを返すことはできますか?

注:これは宿題のためであり、メモリリークは最後の懸念事項です。シンプルさとスピードが私の一番の問題です

回答:

回答№1は2

いいえ、割り当てることはできません NULL オブジェクトに。

Matrix mat; mat = NULL;

あなたの場合は違法です。あなたが持つことができるようにしたい場合 NULL、代わりにポインターを使用できます(rawまたはsmart)。


回答№2の場合は1

関数からオブジェクトを返すには、次のものが必要です。アクセス可能なコピーまたは移動コンストラクター。代入演算子は必要ありません。それは、割り当てにのみ必要です。もちろん、以前に宣言された変数に関数の結果を割り当てる場合は、それが必要になります。

パブリックコピーコンストラクタとコピー割り当て演算子は、自分で「気にしない」場合に自動的に生成されることに注意してください。

ただし、オブジェクトがデストラクタで解放されたリソースを管理している場合は、「考慮する必要があります」 3つのルール。コピーを実装または削除する必要がありますコンストラクターと代入演算子。そうしないと、誤ってメモリリークが発生する可能性が非常に高く、さらに悪いことに、2つのオブジェクトが同じリソースを解放しようとする可能性が非常に高くなります。

新しい質問に答えるために、「オブジェクトの代わりにnullポインタを返すことはできません。ポインタ(ツリーに含まれる何かへの生のポインタ、または std::unique_ptr<Type> メモリリークの可能性を減らすために、新しく割り当てられたコピー、または boost::optional<Type>.