プロが教える店舗&オフィスのセキュリティ対策術

C++のconstについての質問です。
値を変更しないというのがconstの役割のようですが、値を変更しないと分かっているものは全てconstを書くようにしていますか?

例えば以下のサイトではconstが省略されています。
http://www.alpha-net.ne.jp/users2/junchoon/tips0 …
このhwndはconstが省略されています。
static void on_create(HWND hwnd){
WM_TASKBARCREATED = RegisterWindowMessage("TaskbarCreated");
icon_add(hwnd);}
です。

これが特別というわけでもなく、どちらかというとconstが書かれていないことが多いようです。

あなたがconstを使う理由を教えてください。

A 回答 (4件)

「ROM化したい。


というのはいかがでしょう。

もうひとつ、
「最適化の恩恵を受けたい。」
あまり当てにならないそうですが...。
    • good
    • 0

# カテゴリ違い (JavaのカテゴリなのにC++の質問) なので、削除されるかもしれませんが......。



> 値を変更しないと分かっているものは
というより、「変更されては不都合なもの」、「変更があり得ないもの」をconstにすべきだと思います。

ご質問の例では、hwndは現在変更の必要がないから変更していないだけのように見えます。
そもそもhwndは動的に管理されているものですし、hwndを取得するAPIは (FindWindows を初めとして) 山ほどありますし......。


fighting40さん> 昔のC言語など、constがない言語では定数として扱っている変数に誤って代入してしまう

の場合は、マクロ定義 (#define) を使えばよいと思います。
固定リテラルに置換されるので、constと同機能とは言えませんが、値を書き換えさせない目的は果たせます。
ただし、かの高名なKernighan氏も現在は、「マクロよりconst、enumeを使うべき」と主張されているようです。(当然でしょうが)

# C言語は"Hello world!"程度の知識しかないので、あまり参考にならないと思いますが......。
    • good
    • 0

>static void on_create(HWND hwnd){


>WM_TASKBARCREATED = RegisterWindowMessage("TaskbarCreated");
>icon_add(hwnd);}


ここの例の場合、誰が”どこの”値を変更できないようにする必要があるかでは?
今回の場合、HWNDは値をそのまま渡しているので、呼び出し元のHWNDの値は関数側からは変更不可能ですよね。

わかりやすい例ですと、lstrcpyかと。
宣言見ると、
lstrcpy(LPTSTR , LPCTSTR)
ですが、こうなっていると、第2引数が指す文字列はAPI内で変更することはできませんよね。

また、MFCのCStringでは、LPCTSTRのキャスト演算子は定義されていても、LPTSTRのキャスト演算子は定義されていません。
これは、取得したポインタが指す内容を、呼び出しプログラム側から変更されては困るからです。
    • good
    • 0

私は積極的にconstを使っています。


constはプログラミングする際に誤りを減らすためのものです。
昔のC言語など、constがない言語では定数として扱っている変数に誤って代入してしまうことがありますが、constを使うことによってそういったバグは、コンパイル段階で発見できます。
また関数そのものをconstにすることによって、メンバー変数の内容を変更しないということを保障できます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!