山口屋~活動日誌~

私生活で主な出来事をピックアップ

in-class initializer のあるメンバーは const である必要があります C/C++ スタティック static 変数

2024-01-14 13:37:51 | ソフトウェア開発
Visual Studio で「in-class initializer のあるメンバーは const である必要があります」というエラーが出てしまい悩まされたが、クラスメンバのスタティック変数の初期化の書き方に問題があったようでした。

・staticメンバ変数はクラス宣言の外(ソースファイル)で初期化する。
・先頭に(const な場合はそれも含めて)型名を付ける。初期化子で記述も可能。

中の下の上の真ん中あたり:【C++】static constなメンバの初期化
Theoride Technology:実践C++入門講座 第28回目 staticメンバ、および、クラス外でメンバを定義する
秋山ブログ:C++で静的メンバ変数の配列を初期化する

C言語 C++ 値 アドレス 参照 ポインタ 演算子 メンバ関数 関数ポインタ const

2024-01-08 13:29:45 | ソフトウェア開発
★変数
 type x → typeの値を格納する値型変数(引数であれば、値がコピーされて代入される)
 type* x → typeのアドレスを格納するポインタ型変数(引数であれば、アドレスがコピーされて代入される)
 type& x → 値の複製はせずに同一のアドレスを指す参照型変数、C++のみ。アドレスを初期化で格納した後は、アドレスの変更はできないが値の変更はできる。引数値、戻り値とした場合、値型変数では値の複製が自動実行されるが、参照型変数では値の複製は自動実行されない。

★演算
 & → アドレス演算子。変数のアドレスを示す。(主として値を格納する変数に対して使用)
 * → 間接演算子。参照先の値を示す。(主としてアドレスを格納する変数に対して使用)

通常変数に対する「&」とポインタ変数に対する「*」がペアになって使用されると考えてよい。変数の値を操作するため、関数の引数としてコピーではなくオリジナルを渡したいときは「&」をつけてポインタ渡しを行い、関数内では「*」を付けて値参照するというものだ。

★構造体メンバ変数の参照方法
 値→「.」(ドット演算子)
 アドレス→「->」(アロー演算子)

配列や構造体では以下の関係が成り立つ。
array[0]⇔*array
struct->member⇔(*struct).member

★メンバの関数ポインタ
 ポインタデータ型 (クラス名::*ポインタ変数名)();
 ※データ型は関数の戻り値に対応させる

これは難しい。下記のサイトに情報があった。
マルペケつくろーどっとコム:->、*、&、[]演算子って奥深い

★メンバ関数のconst修飾子
〇メンバ変数のデータ(値 or ポインタ)の書き換えができなくなる
→ポインタ型の前constは値、後constはアドレスの書換禁止なので、ポインタ型で戻り値がある場合、後constとは意味が重複する。ポインタ型で前constを付けた戻り値にすれば書換できなくなる。
→結果的にメンバ関数内でメンバ変数を書き換えないという意味。

下記のサイトの説明がわかりやすかった。
ドクロモエ:【C++】const の扱いが複雑すぎる
Flat Leon Works:【C++】メンバ関数には必要に応じてconstをつけよう