ポインタ渡しと参照渡し

13
ポインタ渡し参照渡し 1

Upload: cocodrips

Post on 13-Apr-2017

925 views

Category:

Technology


0 download

TRANSCRIPT

ポインタ渡しと参照渡し

1

2

@cocodrips !

「C++書きたい!」 -> 据え置きゲームの会社に就職 !

でも今はC++++かいてる

3

C++歴 : 1000行くらい 使いみち : プログラミングコンテスト (アルゴリズム, ゲームAI) たまーにゲームサーバ

4

5

✦ポインタで渡すのと参照で渡すの何が違うの?

✦どう使い分ければいいの?

6

✦ 無駄なコピーが発生しない大きいオブジェクトはポインタ/ 参照 で渡したい

ポインタ渡しと参照渡し

10MBのimgを渡す

image gray_scale(image img) { … return img; } !

image gray_scale(image *img) { … } !

10KB

4byte/8byte

7

ポインタ渡しと参照渡し

✦ 戻り値をたくさん返したい時に、ポインタ/参照を渡す(実行結果とエラーコードなど)

ポインタ渡しと参照渡し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つけて変えない感だす

まとめ:こうやって使いわけよう!12

ポインタ 参照

呼び出し先で変更するもの

呼び出し先で変更しないもの

必ずconstつけよう

参考13

✦ A History of C++: 1979- 1991http://www.stroustrup.com/hopl2.pdf