問題タブ [copy-assignment]

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.

0 投票する
1 に答える
5952 参照

c++ - 配列メンバーによるデフォルトのコピー割り当て

次のようなクラス定義があります。

コピーの割り当てが正しく機能することを確認する単体テストが失敗しました。驚いたことに、buffer[]配列の途中の1バイトが正しくコピーされませんでした。

私の理解では、デフォルトのコピー代入演算子はメンバーごとのコピーを実行し、配列メンバー(配列メンバーへのポインターではない)の場合は、配列の要素ごとのコピーを必要とします。私は間違っていますか?

ここでの私の直感は、アレイの真ん中に踏みつけられたどこかでぶら下がっているポインターに噛まれたということです。しかし、たとえば、これらのオブジェクトのベクトルを別のベクトルにコピーすると、これが繰り返し発生します。

誰かが私がどこで間違っているのか教えてくれませんか?

編集:

これを少し拡張するために、クラスはPODタイプではありません。いくつかの抽象基本クラスから派生しているため、仮想デストラクタがあります。ただし、配列は唯一のデータメンバーであり、単体テストで壊れた使用法は次のとおりです。

0 投票する
5 に答える
362 参照

c++ - copy-ctorをcopy-operatorの観点から実装しますか、それとも個別に実装しますか?

これは、operator =の観点からコピーコンストラクターを実装することの複製ではありませんが、より具体的な質問です。(またはそう思うのが好きです。)

イントロ

このような(架空の)クラスが与えられた場合:

構成をコピーしたり、NonCopyableオブジェクトをコピーしたりすることはできないため、デフォルトで生成された関数でこれをコピーすることはできません。ただし、オブジェクトのこの部分は、実際にはコピーする必要のない実装の詳細です。

また、このためのスワップ関数を作成しても意味がありません。これは、スワップ関数がstd :: swapの機能を複製できるためです(NonCopyableを除く)。

したがって、これらのオブジェクトをコピーする場合は、copy-ctorとcopy-operatorを自分で実装する必要があります。これは、他のメンバーを割り当てるだけで簡単に実行できます。

質問

copy ctorとoperatorを実装する必要がある場合、copy演算子の観点からcopy ctorを実装する必要がありますか、それとも初期化リストを使用してコードを「複製」する必要がありますか?

つまり、与えられた:

私たちはa)を書くべきですか

またはb)

答えの考えられる側面は、パフォーマンス対保守性対可読性です。

0 投票する
6 に答える
3444 参照

c++ - 実装提供のコピー コンストラクターと代入演算子

実装 (コンパイラ) がコピー コンストラクターとコピー代入演算子を提供しない状況について、少し混乱しています。

  1. クラスでコピーctorおよび/またはコピー代入演算子を宣言するとき。
  2. プライベートコピーctorおよび/またはコピー代入演算子を持つクラスから派生すると言う人もいます。

私は2番目の状況について少し混乱しています.2番目の状況はまさにそうです.
a) 実装では宣言されないため、コンパイル時にエラーが発生します。
または
b) 実装はそれらを宣言および定義しますが、コンパイラ定義の実装が基本クラスのメソッドを見つけようとすると、コンパイル時エラーが発生します。

私は昨日インタビューを受けました、私はその(b)が起こっていると言いましたが、インタビュアーは同意しません、彼は(a)と言いました。

Microsoft C/C++ 14.00 と gcc 4.4.5 の両方で次のコードをコンパイルしようとしました。

Microsoft コンパイラの出力

gcc コンパイラ出力

したがって、実装はそれを宣言して定義すると思いますが、コンパイラ定義の実装が基本クラスのメソッドを見つけようとすると、コンパイル時エラーが発生します。私が間違っている場合は修正してください。

0 投票する
3 に答える
4758 参照

ruby - Ruby でのオブジェクトの割り当て

C++ のバックグラウンドを持っているので、Ruby でのオブジェクトの割り当てに興味があります。次のオブジェクトの割り当てについて考慮すべき事項 (ある場合):

0 投票する
4 に答える
8781 参照

c++ - C++オブジェクトのインスタンス化と割り当て

これの違いは何ですか:

この:

2番目はコンストラクターを2回呼び出し、次にoperator =を呼び出す可能性があると予想しましたが、代わりに、最初のコンストラクターと同じように、コンストラクターを1回だけ呼び出します。

0 投票する
1 に答える
1520 参照

c++ - オブジェクトの配列でのデフォルトのコピー動作

メンバーとして配列を持つクラスがある場合:

そして、そのインスタンスをコピーします:

arrayバイトごとに memcpyされるかObject::operator=、要素ごとにコピーされますか?

0 投票する
1 に答える
111 参照

c++ - 継承された加算割り当てop。、適切な型を返すにはどうすればよいですか?

N次元ベクトル空間での一般的な演算を因数分解するために、このクラスがあります。

注:ドキュメントとテストの量を最小限に抑えるために、できるだけ多くのコードを分解したいと思っています。

ここで、2つのクラスを導出します。

これらのクラスは、加算とスカラー乗算(コンポーネント単位の演算)に対して同様に動作します。だから、私は因数分解して基本ベクトルクラスに入れたいと思いoperator+=()ますoperator*=()

私の質問は次のとおりです。適切なタイプの参照を返すにはどうすればよいですか?

これまでの私のアイデア(以下にリストされている)はすべて満足のいくものではありません。いくつかの提案をいただければ幸いです。


アイデア#1:C++共変リターン型メカニズムを使用します。しかし、その後、派生クラスでこれらの演算子をオーバーロードする必要があります-私は正しいですか?(これは、私にとって重複テストを意味します。)

アイデア#2:テンプレートを探しますか?

アイデア#3:コードをベースベクトルのプライベートメンバーに因数分解しますが、派生クラスに関数を追加する必要があります(テストするものを追加する必要があります)

0 投票する
2 に答える
298 参照

c++ - 奇妙なコピー コンストラクタ

次の C++ プログラムを使用します。

次の結果が得られました。

アドレス「0x28ff08」のオブジェクトと、アドレス「0x28ff04」のオブジェクトから作成された関連コピーで何が起こるかを誰か説明できますか? ここでコピーコンストラクターが呼び出される理由が本当にわかりません。


これが正しいかどうかわからないので、さらに詳細に説明したいと思います。誰かが私の間違いを見つけたら、指摘してください。

まず、画像は実行フローの詳細を示しています。 実行フロー

(1)。a値 1のオブジェクトを作成します。

(2)。関数を呼び出しますf()。オブジェクトを作成するtempと、コンパイラはオブジェクトが返されることを検出するため、呼び出し元のスタックに直接作成されます。

(3)。の返されたオブジェクトf()(つまり、temp) を objectaoperator=()割り当てaます。

(4)。オブジェクトは、同じ変数名を使用してパラメーター (右辺値) としてa渡されます。operator=()a

(5)。メソッドoperator=()main::a(左辺値、表記の乱用) で呼び出されるため、関数内で [!!これは私を混乱させた部分]; をthis指します。main::a

(6)。の値をtoのoperator=()値に変更します (つまり、1 から 2 に)。main::aa

(7)。コンパイラは、戻り値の型が参照ではなく、*this既に に存在するmain()ことを検出したため*this、コピー コンストラクターを呼び出してコピーする必要があります。ただし、コピー コンストラクターはオブジェクトを初期化しないため、初期化されていないオブジェクトが作成されます。

(8). [!!この部分についてはよくわかりません] 左辺値と結果のオブジェクトは同じオブジェクトであるため、最適化のために実際にはオブジェクトは返されません。

(9)。@Mike Seymourによると、コピーされたオブジェクトは破棄されます。このオブジェクトは、コンストラクターとデストラクターの両方が実際に何かを行うため(値とアドレスを出力するなど)、コンパイラーがそれを省略できないため作成されます。

(10)。を終了するoperator=()と、オブジェクトaは破棄されます。

(11)。を終了するmain()と、オブジェクトmain::aは最終的に破棄されます。

上記は出力を説明していますが、私の現在の理解は正しくない可能性があります。私が間違っている場合は、これを理解するのを手伝ってください。どうもありがとう。

0 投票する
1 に答える
341 参照

c++ - カスタム コピー代入演算子がプログラムをクラッシュさせる (C++)

メモリを自動的にクリーンアップするためのカスタム クラスを作成しています。このクラスには SDL_Surface オブジェクトへのポインタが含まれており、必要に応じてその refcount を呼び出します。問題は、カスタム コピー代入演算子を実装すると、システムが次のコードでクラッシュすることです。

「xyz.exe の 0x771a15de で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0xcccccd04.」

オブジェクト属性「アドレス」は突然値「0x0000ffff」を取得しますが、デフォルトのコピー割り当て演算子を使用すると、完全に正常に実行されます。

0 投票する
1 に答える
155 参照

c++ - C++ では、基本クラスを取るコンストラクターはコピー コンストラクターとしてカウントされますか?

例えば:

  1. 示されているコンストラクターはコピー コンストラクターとしてカウントされますか?
  2. 示されている代入演算子は、コピー代入演算子としてカウントされますか?