OpenJudge 3週目テスト-01

4612 ワード

001:何を返したらいいですか


サンプル入力
2 3
4 5

サンプル出力
123
2
3
4
5 

コード:
#include 
using namespace std;
class A {
public:
	int val;
	//  
	A(int num = 123) :val(num) {}
	A &GetObj() {
		return *this;
	}
};
int main()
{
	int m,n;
	A a;
	cout << a.val << endl;
	while(cin >> m >> n) {
		a.GetObj() = m;
		cout << a.val << endl;
		a.GetObj() = A(n);
		cout << a.val<< endl;
	}
	return 0;
}

ぶんせき
  • 出力結果から見ると、最初から123が出力されていました.これはA a; cout << a.val << endl;の結果です.ここでは構造関数を再ロードしたと思っていましたが、123をデフォルト値とすることができることに気づきました.そのため、答えのA(int num = 123) :val(num) {}
  • に対応しています.
  • は、whileサイクルにおいて、オブジェクトaがメンバー関数を呼び出すのを見る.等号の左側に現れ、まずこの関数の戻り値が*thisであることを考慮し、同時に等号の右側の数字も一時変数を生成し、付与
  • を完了する.
  • ここで注目すべきは&記号であり、関数が返すタイプがクラスオブジェクトである場合、複製構造関数が呼び出され、オブジェクトの参照である場合、
  • は呼び出されない.
    A &GetObj() {
    		return *this;
    	}
    

    レプリケーションコンストラクション関数が呼び出された場合、返されるオブジェクトはaではなく一時的なオブジェクトであり、後続の出力は123であり、参照タイプであればaオブジェクトの変更である.