4.その他のC++特性
1.参照パラメータ
(1)値や常引用を入力パラメータ、ポインタを出力パラメータとするのがグーグルの慣例である.
2.関数のリロード
(1)利:コードをより直感的にすることができる.テンプレート化されたコードには、リロードが必要かもしれません.アクセスコントローラの実装には、リロードも便利です.
(2)弊害:関数をパラメータタイプのみで再ロードする場合は,パラメータマッチングルールを深く理解する必要がある.サブクラスがベースクラス関数を書き換えるのも迷惑です.
(3)リロード時には,そのパラメータ名に基づいて関数の名前を付けることを考える.AppendString()はAppend()より良いです.
3.デフォルトパラメータ
(1)デフォルトパラメータは、コードのメンテナンスが困難な問題を引き起こす.
4.可変長配列とメモリ申請
(1)可変長配列とalloc()はC++標準の一部ではなく,スタック容量に応じて空間を申請するとメモリオーバーライド欠陥を引き起こす可能性がある.
(2)scoped_のようなより安全なメモリ申請関数の使用ptr/scoped_array.
5.友元
(1)友元クラスと友元関数の使用を適度に許可する.
(2)友元はその友元クラスと同じファイルに定義されるべきである.
(3)友元はクラスのパッケージ性を破るのではなく拡張のみである.1つのクラスが別のクラスのプライベートメンバーにアクセスする必要がある場合、友元はこのメンバーよりも公有化されたほうがよい.
(4)また,クラスとクラスの連携は共有メンバーのみである.
6.異常処理
(1)通常はC++の異常処理は使用しない.
7.ランタイムタイプ情報
(1)RTTIは推奨されません.
(2)ユニットテストを除き,RTTIを使用しない.確かに、オブジェクトタイプに基づいて異なる機能を完了する必要がある場合は、代替案を考慮します.ダミーメソッドは、サブクラスに異なるコードを実行させるためのプリファレンスです.
8.タイプ変換
(1)static_の使用castはCスタイルの値変換を行うか、サブクラスポインタを基本ポインタに引き上げます.
(2)const_の使用castはconst修飾を取り除きます.
(3)reinterpret_の使用castは安全でないポインタタイプ変換を行います.
(4)dynamic_castはテストでのみ使用されます.
9.ストリーム
(1)ストリーム(stream)の構造と構造関数は自動的に関連ファイルを開き、閉じます.
(2)ログインタフェースが必要でない限り,ストリームは使用しない.
10.前置自増および前置自減
(1)戻り値を考慮しない場合,前置性能は常に後置より優れている.iが反復器または非スカラータイプの場合、後置きはiをコピーする必要があり、コピーのオーバーヘッドは大きい.
11.const修飾子の使用
(1)const修飾を推奨する場合
a.関数は、参照またはポインタによって伝達されるパラメータ値を変更しない.
b.クラスメソッドはできるだけconstとして定義する.例えば、アクセサ、クラスデータメンバーを変更せず、非constメソッドを呼び出さず、非const参照またはポインタを返さない関数.
c.初期化後、変更するデータメンバーは必要ありません.
12.整形タイプ
(1)stdint.hでint 16_が定義されているt、uint32_t,int64_t等の整型は、整型に用いる場合、これらの正確なタイプが好ましい.
(2)符号なしuint 32_は使用しないtは、数値ではなくビットグループが格納されることを正確に知らない限り、またはバイナリ符号オーバーフローを定義しない.
(3)符号なしタイプを用いて1つの数の非負を説明するのではなく,断言で説明すべきである.
13.64ビット互換性
(1)
(2)sizeof(void*) != sizeof(int)、ポインタサイズの整数が必要でintptr_を使用t.
(3)64ビット定数を宣言する場合、LLまたはULL接尾辞を使用する.
14.前処理マクロ
(1)マクロを使用する場合は、注意が必要です.マクロの代わりに、インライン関数、列挙、定数を使用します.
(2)マクロの大量使用による問題を回避できる方法
a.ヘッダファイルにマクロを定義しない.
b.マクロ前定義(#define)を使用し、使用後直ちに定義を解く(#undef);
c.1つのマクロを定義しないで、それを使用して別のマクロを定義します.
d.アンバランスC++構造をもたらすマクロは使用しないでください.
e.関数、クラス、変数名の先頭に#を使用しないでください.
15.0とNULL
(1)整数用0,実数用0.0,ポインタ用NULL,文字用'0'.
(2)GCC4.1.0では、sizeof(NULL)とsizeof(0)は等しくありません.
16.sizeof演算子
(1)sizeof(type)ではなくsizeof(varname)を使用して変数またはタイプのサイズを決定する.
(1)値や常引用を入力パラメータ、ポインタを出力パラメータとするのがグーグルの慣例である.
2.関数のリロード
(1)利:コードをより直感的にすることができる.テンプレート化されたコードには、リロードが必要かもしれません.アクセスコントローラの実装には、リロードも便利です.
(2)弊害:関数をパラメータタイプのみで再ロードする場合は,パラメータマッチングルールを深く理解する必要がある.サブクラスがベースクラス関数を書き換えるのも迷惑です.
(3)リロード時には,そのパラメータ名に基づいて関数の名前を付けることを考える.AppendString()はAppend()より良いです.
3.デフォルトパラメータ
(1)デフォルトパラメータは、コードのメンテナンスが困難な問題を引き起こす.
4.可変長配列とメモリ申請
(1)可変長配列とalloc()はC++標準の一部ではなく,スタック容量に応じて空間を申請するとメモリオーバーライド欠陥を引き起こす可能性がある.
(2)scoped_のようなより安全なメモリ申請関数の使用ptr/scoped_array.
5.友元
(1)友元クラスと友元関数の使用を適度に許可する.
(2)友元はその友元クラスと同じファイルに定義されるべきである.
(3)友元はクラスのパッケージ性を破るのではなく拡張のみである.1つのクラスが別のクラスのプライベートメンバーにアクセスする必要がある場合、友元はこのメンバーよりも公有化されたほうがよい.
(4)また,クラスとクラスの連携は共有メンバーのみである.
6.異常処理
(1)通常はC++の異常処理は使用しない.
7.ランタイムタイプ情報
(1)RTTIは推奨されません.
(2)ユニットテストを除き,RTTIを使用しない.確かに、オブジェクトタイプに基づいて異なる機能を完了する必要がある場合は、代替案を考慮します.ダミーメソッドは、サブクラスに異なるコードを実行させるためのプリファレンスです.
8.タイプ変換
(1)static_の使用castはCスタイルの値変換を行うか、サブクラスポインタを基本ポインタに引き上げます.
(2)const_の使用castはconst修飾を取り除きます.
(3)reinterpret_の使用castは安全でないポインタタイプ変換を行います.
(4)dynamic_castはテストでのみ使用されます.
9.ストリーム
(1)ストリーム(stream)の構造と構造関数は自動的に関連ファイルを開き、閉じます.
(2)ログインタフェースが必要でない限り,ストリームは使用しない.
10.前置自増および前置自減
(1)戻り値を考慮しない場合,前置性能は常に後置より優れている.iが反復器または非スカラータイプの場合、後置きはiをコピーする必要があり、コピーのオーバーヘッドは大きい.
11.const修飾子の使用
(1)const修飾を推奨する場合
a.関数は、参照またはポインタによって伝達されるパラメータ値を変更しない.
b.クラスメソッドはできるだけconstとして定義する.例えば、アクセサ、クラスデータメンバーを変更せず、非constメソッドを呼び出さず、非const参照またはポインタを返さない関数.
c.初期化後、変更するデータメンバーは必要ありません.
12.整形タイプ
(1)stdint.hでint 16_が定義されているt、uint32_t,int64_t等の整型は、整型に用いる場合、これらの正確なタイプが好ましい.
(2)符号なしuint 32_は使用しないtは、数値ではなくビットグループが格納されることを正確に知らない限り、またはバイナリ符号オーバーフローを定義しない.
(3)符号なしタイプを用いて1つの数の非負を説明するのではなく,断言で説明すべきである.
13.64ビット互換性
(1)
// size_t , inttypes.h
#ifdef _LP64
#define __PRIS_PREFIX “z”
#else
#define __PRIS_PREFIX
#endif
// printf % 32/64
// :
// size_t size = records.size();
// printf(“%”PRIus”
”,size);
#define PRIdS __PRIS_PREFIX “d”
#define PRIoS __PRIS_PREFIX “o”
#define PRIuS __PRIS_PREFIX “u”
#define PRIxS __PRIS_PREFIX “x”
#define PRIXS __PRIS_PREFIX “X”
(2)sizeof(void*) != sizeof(int)、ポインタサイズの整数が必要でintptr_を使用t.
(3)64ビット定数を宣言する場合、LLまたはULL接尾辞を使用する.
14.前処理マクロ
(1)マクロを使用する場合は、注意が必要です.マクロの代わりに、インライン関数、列挙、定数を使用します.
(2)マクロの大量使用による問題を回避できる方法
a.ヘッダファイルにマクロを定義しない.
b.マクロ前定義(#define)を使用し、使用後直ちに定義を解く(#undef);
c.1つのマクロを定義しないで、それを使用して別のマクロを定義します.
d.アンバランスC++構造をもたらすマクロは使用しないでください.
e.関数、クラス、変数名の先頭に#を使用しないでください.
15.0とNULL
(1)整数用0,実数用0.0,ポインタ用NULL,文字用'0'.
(2)GCC4.1.0では、sizeof(NULL)とsizeof(0)は等しくありません.
16.sizeof演算子
(1)sizeof(type)ではなくsizeof(varname)を使用して変数またはタイプのサイズを決定する.