C++初心者です。constメンバ変数の初期化について教えてください。クラスの中に、static constメンバ変数(配列)を持ちたいのですが、<コード1>class hoge {public : hoge(){}; virtual ~hoge(){}; static const … このサイトを利用することによって、あなたはこのサイトのCookie Policy、Privacy Policy、およびTerms of Serviceを読んで理解し、同意したものとみなします。, スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。すぐ登録できます。, (参考書:明解c++中級編の426ページ)char* p[] = { "PAUL", "X", "MAC" }; C言語 for文、while文で無限ループを作るときは、3つのことを念頭に置いて作ろう. 初期化されていないC文字列の警告なし (2) . version.hではVERSIONをexternように宣言してください . 2)2番目の方法は では、具体的にconstを付与したプログラム例を示しましょう。 constは皆さんの作るプログラムをより安全にするための仕組みです。もちろん、使わなくてもプログラミングはできますが、大規模システムになるほど安全性を高めることが重要になるのです。, 「const」とは修飾子と呼ばれるキーワードです。「constant:定数」の略称であり、定数を作り出すための機能です。, const修飾子を使用することで、変数の値を「書き換え禁止(読み取り専用)」にすることができます。, 変数を読み取り専用にすることで、書き換えてはいけない変数に対して「間違えて書き換えてしまった…」といった、不慮の事故を防止することができます。, 変数に鍵を掛けてロックする。それがconst修飾子の役割であり、安全化するための仕組みです。, 「const」は変数を読み取り専用にすることで保護を行いますが、「static」は変数や関数の参照範囲を狭めることで保護します。保護方針は異なりますが、非常に近い兄弟のような関係です。, staticに関して知りたい方は『C言語 staticの利用価値【システムを安全にする仕組みを解説】』の記事を参考にしてください。, 「const」と「static」キーワードは併用することも可能です。この2つは喧嘩せず、仲良しなんです。, 変数にconst修飾子を付与するのは簡単です。変数定義に「const」を記述するだけです。, 定数には代入処理ができません。そのため初期化でしか値を与えることができないのです。, constで定義した変数に対して、値の書き換えを行おうとするとビルドエラーが発生します。, 変数への「初期化」と「代入」は違う!constはその影響がある代表的なキーワードです。const変数は必ず初期化しましょう。, ポインタ変数に対する使い方は少し注意が必要です。なぜかというと、定義の方法が2種類あるからです。, ここで大事なことは、「ポインタ変数」とはその性質上、2つのメモリを管理していることです。, ポインタについて知りたい方は『C言語 ポインタ変数定義の正しい解釈とは【「*」の意味を解説】』の記事を参考にしてください。, それでは、この知識を踏まえた上で、ポインタ変数とconst修飾子の関係を掘り下げましょう。, ポインタ変数の定義に対してconstの付与方法は、次の2つの書き方があり意味が異なります。, constを付与している位置が異なるのがわかりますね。この位置によって定数化する対象が変化します。, この付与パターンはポインタの図で言うと、それぞれ別のメモリを書き込み禁止にします。, 続いてconstパターン②で、書き込みができないパターンのプログラムを紹介しましょう。, この2つのパターンでよく利用されるのは、パターン①の方です。ポインタの番地を固定化する必要性はあまりないので、私はパターン②をほとんど見たことはありません。, constはテーブルと呼ばれるデータを作り出す時によく利用されます。テーブルは構造体と配列を使った固定データの塊のことです。, このようなプログラム実行時に変更の必要がない情報を「テーブル」と呼ばれる形でまとめておくのです。必要な時にテーブルを参照し、情報を取り出して利用します。, もうひとつのconstを使うシーンが、関数のポインタ引数に対してです。特によくあるのが、構造体のポインタ渡しの時に、構造体データを保護するシーンです。, この場合、関数の引数で構造体データを値渡しで行うと、スタックメモリを過度に消費する傾向があります。そのため、構造体はポインタで引き渡すことがよくあります。, printFruit関数は、価格を表示するだけの機能のはずが、誤って価格を100円に値下げしてしまいました。このように、ポインタでデータを渡すというのは、データを書き換えられてしまう危険性があるのです。, このような時はポインタ引数にconstを付与することで「渡されたポインタのデータは書き換えませんから、安心して渡してください!」と意思表明することができます。, このように、ポインタにconstを付与することでpriceの書き換えはビルドエラーが発生します。, 関数をサービスとして提供している側からの視点で「書き換えないので、安心してポインタを渡してください!」と伝えるためにconstを付与して定義します。, enumによる定数定義は『C言語 enum 列挙型【連番の作り方と使いどころを教えます】』の記事を参考にしてください。, defineによる定数定義は『C言語 define マクロ【数値に名前を付ける意味とメリット】』の記事を参考にしてください。, 3つの選択肢がありますが、どれを使うか迷うことはありません。それぞれが適切な利用シーンがありますので、合わせて使ってあげるとよいでしょう。, 年間200人以上のプログラミング初心者・未経験者を直接指導で教育している現役エンジニアです。, 本サイトでは開発経験20年のノウハウ・学習ポイント・カリキュラムを全力でわかりやすく解説します!, C言語を扱う上でよく利用する機能を紹介します。標準ライブラリ関数の使い方やC言語で利用するキーワードの解説など、様々なC言語に関する情報をお届けします。, 独学でプログラミングを始めようとしている方へのC言語入門学習カリキュラムです。C言語を学ぶために必要な知識を順序立てて解説します。順に進められる構成となっており、課題が用意されているため理解を確認しながら進めることができます。. この時に注意しなければならないのが、必ず初期化することです。 定数には代入処理ができません。そのため初期化でしか値を与えることができないのです。 変数へのconst修飾子の付与. 2.1 間違い①「static」の意味がわかってない。 2.2 間違い②ヘッダファイルにグローバル変数を宣言。 3 正しいやり方 / C言語・定数配列の宣言方法