令和元年度(再試験) III-8

科目: 専門科目 / 分野: 情報工学部門 / 年度: 令和元年度(再試験)

III-8 問題画像

出典:公益社団法人 日本技術士会「技術士第一次試験 過去問題」

C++プログラム(クラスSample、演算子operator=のオーバーロード、関数addの値渡し)の実行結果を求める問題。初期化と代入の違い、オーバーロードの選択、値渡しを理解する。

解説

この問題で問われていること

C++の初期化と代入の違い、演算子オーバーロードの呼出し、値渡しによるコピーを追跡する問題。

解き方

① 宣言時の「=」は初期化(コンストラクタ)で、代入演算子は呼ばれない。値渡しはコピー。代入は引数の型が一致するoperator=が選ばれる
② Sample s = 1 → val=1。add(s)でコピーx(val=1)。x = 1はintなのでoperator=(int)でval+=1 → 2
③ 2(②)

正解が正しい理由

mainで、Sample s = 1;は、初期化(コピー初期化)であり、コンストラクタSample(int i)が呼ばれてs.val=1となる(operator=は呼ばれない)。add(s)は、値渡しなので、sのコピーxが作られ、x.val=1。add内のx = 1;は、代入であり、引数がintなので、operator=(int i)が選ばれて(operator=(Sample)よりも完全一致)、val += 1となり、x.val=2。return xで、xのコピーが返され、その.valは2。したがって、出力は2で、②が正しい。

各選択肢について

覚えるべきポイント

C++では、宣言時の= は初期化(コンストラクタ)で、代入演算子は呼ばれない。関数への値渡しでは、コピーが作られ、元のオブジェクトは変わらない。オーバーロードは、引数の型が完全一致するものが優先される。

キーワード: C++、演算子オーバーロード、operator=、値渡し、コンストラクタ、初期化と代入、オブジェクト指向、情報工学部門