質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2174閲覧

C++ オブジェクト生成方法の違いについて

qwerty123

総合スコア26

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

0クリップ

投稿2016/11/29 23:43

オブジェクト生成に関する質問です。
以下の2パターンでは、内部で行われていることが違う、らしいのですが、何がどう違うかわかりません。

(Aはクラスです)

//①
A a1;
A a2 = a1;

//②
A a3;
a3 = a1;

a2とa3は別物、ということなのですが、理由がよくわかりません。
どなたかわかる方いらっしゃいましたらよろしくお願いします。

Y.H.👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

//①
A a1;
A a2 = a1; // A::A(const A&) が動く

//②
A a3; // A::A() が動く
a3 = a1; // A::operator=(const A&) が動く

前者はコピーコンストラクタが動きます。
後者は (デフォルト)コンストラクタののち、コピー(operator=)が行われます。

投稿2016/11/29 23:53

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2016/11/30 01:22

ついでの質問で悪いのですが、コピーコンストラクタと代入演算子で外部から見て違う挙動をするコードを、実用目的で使うとしたらどんな場面がありますでしょうか。
episteme

2016/11/30 01:58

要は「"初期化"と"代入"のそれぞれに異なる意味/挙動を与えたいとき」なんですけど、実例を挙げろと言われると即答できないですねー...
majiponi

2016/11/30 02:10

デバッグ時のログ、とかですかね。製品には出てこないですが。
episteme

2016/11/30 02:16

singletonとかならコピーコンストラクトもコピーも"できなくする"あるいは"唯一のインスタンスの参照をコピーする"なんてことしますけどね。 あるいはコピーがどえらく高コストになるならコピー”できなくする”とか。
guest

0

ベストアンサー

epistemeさんの回答のとおりだと思います。

この2つを使い分ける意図は「初期化にかかるコストの効率化」であることが一般的だと思います。

例えば、日付を表すクラスがあって、引数なしコンストラクターは「インスタンス生成時点の日付で初期化」で代入は「thisの内容を右辺の日付と同じ値にする」であるような場合、コピーコンストラクターを使うと引数なしコンストラクターでの「インスタンス生成時点の日付をOSから獲得する」処理が省けるわけです。

もっと原始的には「単にメンバー変数への代入回数を減らす」だけの差であることも多いと思います。せっかくC/C++という超高速な言語を使うならインスタンスのメンバー変数への単純な代入回数でさえ節約したくなります(自分はそうです)のでコピーコンストラクターが使える場面なら積極的にそちらを使います。

投稿2016/11/30 04:02

編集2016/11/30 04:05
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2016/11/30 04:04

スピード狂なら"右辺値参照"もな! (笑
KSwordOfHaste

2016/11/30 16:04 編集

自分はスピード狂という程ではないですが・・・仮引数や戻り値でのT、T&、const T&の選択は意識します。きっとC++のみなさんそうだと思います。JavaなどではT&しか選択の余地がないわけですが、C++使っているのにうっかりTを使ってJavaより効率悪いコードにする愚はおかしたくないですよね。(追記:最初&Tとかいてました。すみません、T&の間違いです。Tは任意のクラス名のつもりです)
episteme

2016/11/30 05:15

それには激しく同意。 とはいえ const T& と T&& を意識するほどではないです(いまんとこ ※ メンバに参照/ポインタ持ってないと T&& に旨みがないんでね
KSwordOfHaste

2016/11/30 05:22

const&Tじゃなくてconst T&でした!!C++の知識も使わないとさび付いてしまってます。失礼しました orz
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問