ども、こんばんわ~
割とふらふらしてきたZAKIです
製作実習が終盤に近づいてきました
最初からクライマックスなチームもいるかもしれませんが、体には…気をつけて

さて、今回のテーマは
「const」です。
プログラムで意外と使われていない
const修飾子。
constを付けると
その変数、構造体に値を代入できなくなります。
そんなのどこで使うんだ?と思われるかもしれませんが、意外と役に立つんですよ?

今回はその使い道をざっと紹介
[0回]
まずは、1年生向け。
まだ授業でやってないかもしれませんが、
関数の引数をポインタで渡す場合で使えます。
構造体をそのまま引数にして渡すと、仮引数(関数側)では
中身を全てコピーします
構造体の中身を関数内で書き換えられる心配はありませんが、コピーってすっごく重いんです

しかも、キャラ構造体なんてHPとか座標とか、いっぱいメンバ変数が入ってます

それを全部コピーしてるとかなり処理時間を食います

そんなときは、
構造体の引数をポインタにします

ポインタは4バイトの数値(たしかw)なのでかなり、素早く引数へ渡すことが出来ます
しかし

そうすると、
関数内部でメンバの値を代入することが出来てしまう
もしも、チームメンバーの誰かが自作関数内で適当な値を入れていたら、
バグが出たときに構造体を渡している
関数全てをデバッグしなきゃいけない

それはつらい

そんなあなたに朗報です。
構造体を渡すときのポインタをconst ポインタにしてしまえばいいんです
struct Chara {
int HP;
int MP;
int damage;
};
void charaDamage(
struct Chara *chara,
const struct Chara *enemy) {
chara->HP -= enemy->damage;
}
int main() {
struct Chara jiki = {100,2};
struct Chara enemy = {100,3};
charaDamage(&jiki,&enemy);
return 0;
}
こういう感じですかね。
こうすると、
enemyの値は変えれない上に、
引数に渡す値も少なくて済みます
チーム製作では、こういう細かな気配りが
バグとデバッグ作業を大量に減らしてくれます
まぁ、多少不便になったりするんですが、オススメです



是非是非試してみてください
さて、次は2年生向け。
C++のクラスで使う場合です
用途的には先ほど説明した1年生向けと似ています
同じく、関数およびメソッドでクラスを引数にしている場合、
const ポインタでクラス変数を渡したとします
そうするとあら不思議。
メソッドが一つも呼べません。
これにはちょっと工夫がいるんです。
const でメソッドを参照する場合、
メソッドもconstである必要があるのです
メソッドもconst?何だそれは?
というと、これです。
class CTest {
private:
int m_hp;
int m_damage;
....
public:
....
inline int hitDamage(
const CTest *test) {
this->m_hp -= test->GetDamage(); }
inline int GetDamage()
const {
return this->m_damage; }
};
これが一番よく使う例だと思います
一番下のインラインメソッドですね。
メソッド宣言の後にconstを付けると、
「
このメソッドの中ではメンバ変数を変更しない」
という意味になります。
「メンバ変数を変更しない」というのはconstの定義にあてはまると思いませんか?

実はその通りで、この
GetDamage()メソッドは
hitDamage()メソッド内で、参照することが出来ます。
ゲッターメソッドは、特に値を変更することも無いので、付けておくといいでしょう


他にも値を変更しないメソッドには積極的に付けていきましょう。
チーム内にconst好き人間(僕)がいるところは特に

と、まぁ、constについて延々と語ってきました。
一口にconstと言っても書き方が他にもありまして、
int const *hensu;
とすると、
hensu自体は値の代入が出来ますが、
*hensuへの値の代入はできません。
そんな使い方もあります

使いようによっては、いろいろなアクセス制限ができますので、
製作チームメンバーをいじめたいときなどに使ってみてはどうでしょう?
それはでは、今回はこの辺で。
あでゅー

ノシ
PR
COMMENT