ポインタ渡しと参照渡し
TRANSCRIPT
6
✦ 無駄なコピーが発生しない大きいオブジェクトはポインタ/ 参照 で渡したい
ポインタ渡しと参照渡し
10MBのimgを渡す
image gray_scale(image img) { … return img; } !
image gray_scale(image *img) { … } !
10KB
4byte/8byte
ポインタ渡しと参照渡し8
ポインタ 参照void swap_ptr(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; } !int main() { int a = 10; int b = 20; swap_ptr(&a, &b); }
void swap_ref(int &a, int &b) { int tmp = a; a = b; b = tmp; } !int main() { int a = 10; int b = 20; swap_ref(a, b); }
べつにどっちでも一緒
ポインタ9
✦ Cの時代からある
✦ なんかムズカシイイメージ
✦ (*ptr) + 1とかはあんまりキレじゃない(小並感)
void swap_ptr(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; } !int main() { int a = 10; int b = 20; swap_ptr(&a, &b); }
参照10
✦ C++から導入される演算時のオーバーロードのため
✦ 関数で渡す時呼び出し先で明示するので 呼び出し元には特に何もしない
✦ nullは受け取れない
class String { char& operator[](int index); };
void swap_ref(int &a, int &b) { int tmp = a; a = b; b = tmp; } !int main() { int a = 10; int b = 20; swap_ref(a, b); } !!
参照は呼び出し先で変更しない11
void f(int a, int &b, int c) { printf(“a:%d c:%d”, a, c); b += 10; }
!!int main() { int a = 10; int b = 20; int c = 30; ! f(a, b, c); } !!
1. 呼び出し元から、それが参照であることがわかりづらい
2. 参照を呼び出し先で変えるのはあまり親切じゃない
3. 呼び出し先で変えないならconstつけて変えない感だす
参考13
✦ A History of C++: 1979- 1991http://www.stroustrup.com/hopl2.pdf