忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

const使ってる?

ども、こんばんわ~

割とふらふらしてきた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

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]