今日のひらしょー本(20150321): Cp1

んーまいった。17日以来の記事になってしまった.むずすぎて何もわからずに毎日終わるな. まあなかなか定着しないけど、小出しでもいいわけだから毎日しっかり成果をだそう.地道にいきます。

今日のひらしょー本の目次

http://snoopopo.hatenablog.com/entry/2015/04/27/114854

ポインタと参照

文法的なところが怪しくてまずコードが読めんので整理.

・ポインタ(※)

int* p = &poyo;  //宣言
int i = *p; //アドレスにある値を使うとき

fnc( &p );  //ポインタ渡し:渡す側
void fnc( int* p ); //ポインタ渡し:受け取る側

・参照

int& ref = poyo;  //宣言
int i = ref //アドレスにある値を使うとき

fnc( ref ); //参照渡し:渡す側
void fnc( int& ref ); //参照渡し:受け取る側

なんか4つ分書いたけど、 一番上の //宣言 とした部分の左辺がメソッドで渡したときの受け取る側だし、右辺が渡す側と同じ

(※)ポインタについては、今回のひらしょーさんのコードでは、こんな書き方してる。

//呼び出し側
char* stageData;
int fileSize;
const char* filename = "stageData.txt";
readFile( &stageData, &fileSize, filename );

//受け取り側
void readFile( char** stageData, int* fileSize, const char* filename ){}

1つ目の引数の stageData の受け取り方、char** buffer がまず何だ、って感じなんだけど、

ポインタのポインタというやつらしい.

stageData はポインタで、readFileの中でポインタの指すアドレスを決めたいので、勿論、非const。

だから、ポインタ自体のアドレスをポインタ渡し(アドレス渡しというかjavaでいう参照渡しというか)してあげて、関数の中で渡されたポインタをそのまま変えてあげたかんじ。

2つ目の引数の fileSize は普通の変数をアドレスで渡して上げてるだけなので、問題なし。これも1つ目の引数と同じでアドレスで渡しているのは、関数の中で値変えたいから。

3つ目の引数の filename は、関数の中で使うだけで値を変えたりしたくないので、const。 そのままポインタ自体を渡しているので、ポインタのコピーができてる?(ポインタのさした先のデータのコピーじゃなくて、ポインタ自体のコピー)

ポインタが指す先のデータはコピられたポインタと変わらないので、

メソッドの中でコピったポインタを通してコピられたポインタと同じようにさした先のデータ見てる.

20150324 add, とりあえずあってそうなのでグレーアウト解除,

配列とnewの違い

「必要なメモリの大きさがコンパイルのときにわかっている」ことと、「関数が終わる時に必ず開放する」ことの2つだ。

( 1.6.7 配列とnewの違い P.51 )

ということは,

int array2 = new int[5];

と書く意味はないということだよね.

int型5個分の大きさだとコンパイルのときにわかっているのだから、newにして曖昧にしておく必要はない。(というかそれだと遅い)

メンバ関数のconst

メンバ関数にconstをつけた関数では、メンバの値を変えることは出来ない.

NimotsuKun2で operator 演算子を使ったけど、

T& operator()( int x, int y ){
    return mArray[ y * mX + x ];
}

const T& operator()( int index0, int index1 ) const {
    return mArray[ index1 * mSize0 + index0 ];
}

( 01_FirstGame\NimotsuKun2\main.cpp )

ここでconstなオペレータ関数と、通常のオペラータ関数を2つ用意しているのは、

メンバを変えたくない関数…つまり、constつき関数からは、constつき関数しかよべないからだ。

・なんで戻り値にもconst?

//↓なんで戻り値にもconst?
const T& operator()( int index0, int index1 ) const {
    return mArray[ index1 * mSize0 + index0 ];
}

→ 戻り値で返した値も変えてほしくないからだ。

あと、しばしconstに悩まされることが多いけど、今の僕が悩まされる程度のことは EffectiveC++第3版の3項 可能ならいつでもconstを使おう の冒頭だけで答えてくれたので、この後もconstで迷ったらこの辺りのページ参照だな。

Effective C++ 第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTI)

Effective C++ 第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTI)

http://snoopopo.hatenablog.com/entry/2015/03/18/031716

これを見ると前回↑の、「constなポインタ」という言葉はかなり意味わからないので修正&追記.