# C++ コーディング規約 ###### tags: `c/c++` `programming` ## 命名規則 | 命名規則名 | 内容 | | --- | --- | | PascalCase | 先頭大文字、それ以降の単語区切りも大文字 | | camelCase | 先頭小文字、それ以降の単語区切りは大文字 | | snake\_case | 全て小文字、単語区切りを`_`(アンダースコア)で繋ぐ | | UPPER\_SNAKE\_CASE | 全て大文字、単語区切りを`_`(アンダースコア)で繋ぐ | - ファイル camelCase C++ヘッダファイルには`.hpp`、ソースファイルには`.cpp`を用いる - 変数 snake\_case 定数も同様に扱う - 関数 camelCase メソッドも同様に扱う - class PascalCase プライベートなデータメンバには末尾に`_`(アンダースコア)をつける - struct PascalCase - enum PascalCase 値はsnake\_case - namespace snake\_case - マクロ UPPER\_SNAKE\_CASE ## コメント 原則としてヘッダの宣言部に記述する 実装部分はコメントがなくても理解できるようなコーディングを心がける ただ、トリッキーな部分や、専門知識が必要な部分はコメントを挿入する またファイルやクラスなどに対するコメントはDoxygenスタイルで記述する ### ファイルに対するコメント ライセンスに関する定型文で始める その次にファイルに関する説明を続ける ### クラスに対するコメント そのクラスの概要を記述する メソッドなどはその都度記述する ### 関数に対するコメント - 概要 - 引数 - 戻り値 上記の順に記述する ### 型宣言に対するコメント その型の概要を記述する enumは要素が何を表すのかコメントを書く ### 変数に対するコメント なるべく関数名でわかるようにするがグローバル変数などには記述する ## ヘッダファイル 全てのソースファイルは対応するヘッダファイルを持つこととする ただ、main()関数やユニットテストなどの小さなC++ソースファイルは例外とする ### 自己完結 ヘッダファイルで使用する外部のヘッダファイルはヘッダファイル内部でインクルードし、ヘッダをインクルードする際に特殊な条件を守る必要がないようにする ### インクルードガード 全てのヘッダファイルはインクルードガードを持つこととする その際のシンボルは`<PROJECT>_<PATH>_<FILE>_HPP`の形をとる ### 前方宣言 前方宣言はソースファイルには書かず、ヘッダファイルに書くようにする ### インクルードの順序 - ソースファイルに対応したヘッダファイル - Cシステムヘッダファイル - C++システムヘッダファイル - Cサードパーティヘッダファイル - C++サードパーティヘッダファイル - 自分のプロジェクトのヘッダファイル 上記の順にインクルードする 順序はアルファベット順とし、違うグループの間には空行を一行設ける ## スコープ ### 名前空間 自分で書いたコードは名前空間の中に書くようにする ### ファイル限定 スコープをファイルに限定したい場合は無名名前空間を利用する ## クラス ### コンストラクタ コンストラクタ内では例外をスローしてはならない ### 構造体かクラスか データを保持するためのものは構造体を利用する 構造体にはアクセッサや初期化の為のコンストラクタなどのみ記述する ### 継承 継承は全てpublicで行う 継承よりも抱合で行えるか検討する ### アクセス制限 データメンバは基本的にprivateにする ### 宣言 - public - protected - private 上記のように宣言をしていく 空のセクションは省略しても良い - 型 - 定数 - ファクトリ関数 - コンストラクタ - デストラクタ - 演算子オーバーロード - 上記以外のメソッド - データメンバ 上記の順に宣言をしていく ## 関数 ### 出力用の引数 出力のみの場合は戻り値を利用する 利用する場合は入力用引数の後に記述する ### 関数は短く 関数は短く一つの動作しか行わないようにする 長い関数は複数の関数に分割できないか検討する ### 参照渡し 参照渡しを利用するときはconst修飾をつけ、値を変更しないことを保証する 値を変更する参照は分かりづらい為利用を避ける ### オーバーロード 具体的にどのオーバーロードが呼ばれるかわからなくとも何が起こるか正確に把握できる場合のみ使用する ### デフォルト引数 変更しないことを前提で使用できる場合のみデフォルト引数を適用する デフォルト引数を指定して呼び出す場合がその関数について理解している時のみに限定する ### 戻り値の型の後置構文 テンプレート引数など使用したら可読性が向上する場合のみ使用する