問題タブ [assignment-operator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - コンパイラ生成のコンストラクタ
これは、次のようなコンストラクターでクラスを作成するとどうなるかを正しく理解するための簡単な質問です。
デフォルトのコンストラクターは既に定義されているため生成されないことはわかっていますが、コピーおよび代入コンストラクターはコンパイラによって生成されます。つまり、これを防ぐためにプライベート コピー コンストラクターとプライベート代入演算子を宣言する必要がありますか?
c++ - どのような状況で、C ++クラスに代入演算子、コピーコンストラクタ、およびデストラクタを提供する必要がありますか?
Say I've got a class where the sole data member is something like std::string
or std::vector
. Do I need to provide a Copy Constructor, Destructor and Assignment Operator?
c++ - コピーコンストラクターと動的割り当て
次のクラスのコピーコンストラクター(およびoperator =)の書き方をお聞きしたいと思います。
クラスノードは、各ノードの座標x、yと別のノードへのポインタを格納します。
クラスNodesList(std :: vectorから継承)は、動的に割り当てられたすべてのノードを格納します
メインプログラム:
}
各ノードの浅いコピーではなく、各ノードの深いコピーを作成したいと思います。コピーコンストラクターを使用したサンプルコードをお願いできますか?
各ノードは複数回指定できます。3つのノードn[1]、n [2]、n[3]がNodesListnl1に格納されている場合、このような状況を考えてみましょう。
n[1]はn[2]を指します
n[2]はn[3]を指します
n[3]はn[2]を指します
A]コピーコンストラクターはノードn[1]を処理します。古いオブジェクトn[1]_oldのコピーで表される新しいオブジェクトn[1]_newを作成します。n [1]_oldからポイントされたノードn[2]はまだ存在しないため、n[2]_newも作成する必要があります...n1_newからn2_newへのポインタが設定されます。
B]次に、2番目の点n[2]が処理されます。2回作成することはできません。n[2]_newはA]で作成されました。ただし、指定されたノードn [3]は存在しないため、古いオブジェクトn[3]_oldのコピーとして新しいオブジェクトn[3]_newが作成されます。n2_newからn3_newへのポインタが設定されます。
C]ノードn[3]_newはすでに作成されており、n[2]_newです。n3_newからn2_newへのポインタが設定され、他のオブジェクトは作成されません。
したがって、コピーコンストラクタは、オブジェクトが過去に作成されたかどうかを確認する必要があります...
いくつかの参照カウントが役立つ可能性があります...
c++ - C++での代入演算子のオーバーロード
私が理解しているように、operator =をオーバーロードする場合、戻り値は非定数参照である必要があります。
次のような場合にnon-constメンバー関数を呼び出せるようにすることはnon-constです。
しかし、なぜそれは参照を返す必要がありますか?戻り値が参照として宣言されていない場合、どのような場合に問題が発生しますか?たとえば、値による戻りとしましょう。
コピーコンストラクタが正しく実装されていることを前提としています。
c++ - C++ コピー構築構築と代入に関する質問
以下は、書籍「C++ Gotchas」の項目 56 からの抜粋です。
Y オブジェクトの単純な初期化が、3 つの異なる方法のいずれかであるかのように記述されることは珍しくありません。
実際のところ、これら 3 つの初期化はすべて同じオブジェクト コードが生成される可能性がありますが、同等ではありません。a の初期化は直接初期化として知られており、期待通りの動作をします。初期化は、Y::Y(int) の直接呼び出しによって実行されます。
b と c の初期化はより複雑です。実際、それらは複雑すぎます。これらは両方ともコピーの初期化です。b の初期化の場合、値 1066 で初期化された、タイプ Y の匿名一時の作成を要求しています。次に、この匿名一時を、クラス Y のコピー コンストラクターへのパラメーターとして使用して、b を初期化します。最後に、匿名のテンポラリのデストラクタを呼び出します。
これをテストするために、データ メンバ (最後に添付されたプログラム) を使用して単純なクラスを作成したところ、驚くべき結果が得られました。c の場合、本で示唆されているのではなく、コピー コンストラクターによってオブジェクトが構築されたようです。
言語標準が変更されたのか、それとも単にコンパイラの最適化機能なのか、誰か知っていますか? Visual Studio 2008 を使用していました。
コードサンプル:
出力:
私が最も驚いたのは、d と e を構築した結果です。正確には、空のオブジェクトが作成され、次にオブジェクトが作成されて空のオブジェクトに割り当てられることを期待していました。実際には、オブジェクトはコピー コンストラクターによって作成されました。
java - Java のショートカット "or-代入" (|=) 演算子
私は Java で長い間比較を行っていますが、そのうちの 1 つまたは複数が正しいかどうかを知りたいです。比較の文字列は長くて読みにくかったので、読みやすくするために分割し、自動的に|=
ではなくショートカット演算子を使用するようになりましたnegativeValue = negativeValue || boolean
。
negativeValue
default<something> 値のいずれかが負の場合は true になると思います。これは有効ですか?それは私が期待することをしますか?Sun のサイトや stackoverflow で言及されているのは見当たりませんでしたが、Eclipse には問題がないようで、コードはコンパイルおよび実行されます。
同様に、複数の論理積を実行したい場合、&=
代わりに? を使用でき&&
ますか?
c++ - 抽象メンバーフィールドへのptrを持つファクトリクラスのcctorとop =を記述する方法は?
zip および rar アーカイブから raw バッファーにファイルを抽出しています。minizip と unrarlib をラップするために以下を作成しました。
Archive.hpp - すべてにアクセスするために使用されます。他のクラスのすべての関数を外部からアクセスできないようにすることができれば、そうします。(実際には、Archive 内の他のすべてのクラスと友達になり、プライベート関数のコールバックを使用できると思いますが、それは遠回りです。)
ArchiveBase.hpp
ArchiveDerived.hpp「派生」は「Zip」または「Rar」
ArchiveDerived.cpp
誰かが私ができるようにこのデザインを使用することを提案しました:
アーカイブの cctor を作成するにはどうすればよいですか?
アーカイブの op= はどうですか?
ArchiveBase::Data
への「名前変更」について何ができArchive::Data
ますか? (minizip と unrarlib の両方が入力と出力にこのような構造体を使用します。データは Zip と Rar では一般的であり、後でそれぞれのライブラリの構造体を作成するために使用されます。) 他のすべては 経由でアクセスされ、外部クラスでArchive
宣言したいと思います。Data
この道も。
class Archive
現在の, nameArchiveBase
を に捨ててArchive
、グローバル ファクトリ関数を使用できることはわかっています。ただし、グローバル関数の使用は避けたかったのです。
c++ - コンパイル時のC++型チェック
すべて。私はC++にかなり慣れていないので、C ++で小さなライブラリ(主に自分のプロジェクト用)を作成しています。型階層を設計する過程で、代入演算子を定義する問題に遭遇しました。
この記事で最終的に到達した基本的なアプローチを採用しました。つまりMyClass
、クラスから派生した階層内のすべてのクラスに対して、次のBase
ように2つの代入演算子を定義します。
私が関わっているのは、型の同等性のアサーションです。私はライブラリを書いているので、おそらく最終結果からアサーションがコンパイルされるので、これにより、次のようなスキームを使用するようになりました。
しかし、コンパイル時に型を確認できるかどうか疑問に思っていました。Boost.TypeTraitsを調べて、やることで近づきましたBOOST_MPL_ASSERT((boost::is_same<BOOST_TYPEOF(*this), BOOST_TYPEOF(rhs)>));
が、rhsは派生クラスではなく親クラスへの参照として宣言されているため、チョークしました。
考えてみると、私の推論はばかげているようです。関数がインラインであるため、実際のパラメーター自体をチェックできることを期待していましたが、もちろん、プリプロセッサーは常にコンパイラーの前に実行されます。しかし、コンパイル時にこの種のチェックを強制できる他の方法を誰かが知っているかどうか疑問に思いました。
c++ - あるタイプのベクトルを別のタイプのベクトルに割り当てる
「イベント」クラスがあります。日付の処理方法により、このクラスを、イベントを保持する「UIEvent」クラスでラップし、イベントの日付を別の形式でラップする必要があります。
イベントからUIEventへの変換とその逆の変換を許可する最良の方法は何ですか?イベントを受け入れるためにUIEventの代入またはコピーコンストラクターをオーバーロードする(またはその逆)のが最善かもしれないと思いました。
c++ - コピー代入演算子 const の戻りパラメータを宣言する必要があるとわかった人はいますか?
コピー代入演算子には、通常の署名があります。
次の署名には実用的な用途がありますか?
どちらか一方のみを定義できますが、両方を定義することはできません。