プログラマーの卵の日記

備忘録になってます!小難しそうなことから超簡単なことまでやってます!!

【C++】引数による内部コピー減らしたい

構成


No.1 引数とかの話
No.2 ゲッターセッターで例を出す







    No.1 引数とかの話


 基本的に引数を持つ関数では、実引数を関数に渡したらコピーを作成してそれを仮引数として扱います。
まぁローカル変数みたいに一時変数ではあるけど容量を取ってしまうしバカでかい引数の羅列を持った関数だったらえぐいことになる…と私は思っているので参照を使いたい。

普通の引数と参照の引数だと何が違うかといえばコピーを行うか、実体(アドレス値)を扱うかという感じ。
ただこれだけで分かるとは思うけど、参照を行えば元の数値(実引数)にも影響を及ぼす。なので、そういった値を絶対弄らないものにはconstを入れればいいだけの話。





    No.2 ゲッターセッターで例を出す


 じゃあまぁ実際に見せてみる。ゲッターセッターでよく使うのでそれを出してみる。


#include 

class A
{
private:
	int m_number;
	int m_error;

public:
	A() : m_number(5), m_error(2) {}
	~A() {}

	const int& GetNumber() { return m_number; }
	void SetNumber(const int& t_number) { m_number = t_number; }

	const int& GetSafe() { return 10; }
	void SetSafe(const int& t_number) { m_error = t_number + 5; }
};


int main()
{
	A a = A();

	std::cout << a.GetNumber() << std::endl;
	a.SetNumber(10);
	std::cout << a.GetNumber() << std::endl;

	std::cout << a.GetSafe() << std::endl;
	a.SetSafe(10);

	return 0;
}

 

ということでやってみれば「warning C4172: ローカル変数またはテンポラリのアドレスを返します」というのを言われると思います。
だって当たり前でしょ?GetSafeにて参照なのにアドレス値ではなくただの数値を入れたんですから。

でも、他はうまくいっています。まぁこういうミスは気を付けようということでちょっとエラー入れ込みました。そんな感じです。