Effective C++

50項 C++をもっと理解するために

C++をもっと理解するためにこの本を読み終わった後、もっとC++を理解するために覚える、知るべきこと。

49項 標準ライブラリに精通しよう

標準ライブラリに精通しようこれもタイトル通りです。

48項 コンパイラの警告に注意しよう

コンパイラの警告に注意しようタイトルの通りです。

47項 非ローカルstaticオブジェクトは、使用前に必ず初期化されるようにしよう

非ローカルstaticオブジェクトは、使用前に必ず初期化されるようにしようグローバルまたは名前空間で定義されていて、クラス内でstaticと宣言されている、またはファイルスコープでstaticと指定されたオブジェクトの初期化順序は特に規定されていません。 順…

46項 ランタイムエラーよりは、コンパイル時やリンク時のエラーのほうがいい

ランタイムエラーよりは、コンパイル時やリンク時のエラーのほうがいいC++はコンパイル時やリンク時のエラーを検出するのに優れています。 ランタイムにエラー検出を行うより、コンパイル時やリンク時に行うほうが安全なので、できる限りコンパイル時やリン…

45項 C++がどんな関数を黙って書き、呼び出しているのか、知っておこう

C++がどんな関数を黙って書き、呼び出しているのか、知っておこうクラスを書くときに、コピーコンストラクタ、代入演算子、コンストラクタ、デストラクタ、アドレス演算子を自分で宣言しないと、コンパイラが自動で作成します。

44項 あなたの意図することを言おう、自分が言っていることの意味を理解しよう

あなたの意図することを言おう、自分が言っていることの意味を理解しよう自分の書いたコードに含まれる、継承や包含、仮想関数がどういった意味を持つのか理解する必要があります。

43項 多重継承は慎重に使おう

多重継承は慎重に使おう 多重継承を使うと、名前衝突により問題が起こることがあります。 あいまいな状態になるときは、 ①同名の関数を複数継承したとき、関数を個別に再定義できない問題 ②1つのクラスを複数の経路で継承してしまうとき、名前解決があいま…

42項 privateな継承はよく考えてから使おう

privateな継承はよく考えてから使おう

41項 継承とテンプレートの違いを理解しよう

継承とテンプレートの違いを理解しよう継承 : オブジェクトが継承可能な関係で、型によって振る舞いを変えたいとき テンプレート : 複数の型に、型によって変わることのない振る舞いを与えたいとき。

40項 「それを持っている」関係や「それを実装手段とする」関係は、層を重ねる形でモデル化しよう

「それを持っている」関係や「それを実装手段とする」関係は、層を重ねる形でモデル化しようタイトルのような関係が成り立つときは、持たれるものを、親のデータメンバに含めます。 層を重ねる、包含、合成などと呼ばれています。

39項 継承の階層構造を下る方向のキャスト(ダウンキャスト)は避けよう

継承の階層構造を下る方向のキャスト(ダウンキャスト)は避けようダウンキャストを安全に行えるdynamic_castがありますが、dynamic_castは使うべきではありません。

38項 継承したデフォルトパラメータ値を再定義してはならない

継承したデフォルトパラメータ値を再定義してはならない基底クラスの仮想関数のデフォルトパラメータと、サブクラスの継承された関数のデフォルトパラメータが違う場合、基底クラスの仮想関数のデフォルトパラメータが継承された関数にも適用されます。 具体…

37項 継承した非仮想関数を再定義してはならない

継承した非仮想関数を再定義してはならない36項で、"非仮想関数を宣言する目的は、関数のインタフェースと強制的な実装を継承させる"としたので、継承した非仮想関数を再定義してはいけません。 継承した非仮想関数を再定義してしまうと、強制的な実装ではな…

36項 インタフェースの継承と実装の継承とを区別しよう

インタフェースの継承と実装の継承とを区別しよう

35項 publicに継承するときは、「その一種である」関係のモデルかどうか確認しよう

publicに継承するときは、「その一種である」関係のモデルかどうか確認しよう

34項 コンパイルするファイル間の依存性はできるだけ減らそう

コンパイルするファイル間の依存性はできるだけ減らそう

33項 関数はよく考えてからインライン化しよう

関数はよく考えてからインライン化しよう

32項 変数の定義は、できるだけ後回しにしよう

変数の定義は、できるだけ後回しにしよう変数の定義を必要なときに行うことで、無駄な変数の定義をを避けられます。 コンストラクタの呼び出し回数を減らすことができ、変数定義と処理が近い場所で書かれているため、コードの可読性が高まります。

31項 関数は、ローカルオブジェクトへのリファレンスや関数の中でnewで初期化したポインタの参照先を返してはならない

関数は、ローカルオブジェクトへのリファレンスや関数の中でnewで初期化したポインタの参照先を返してはならない関数内でローカルオブジェクトへのリファレンスを返すと、関数スコープを抜けたときにローカルオブジェクトが破壊され、リファレンスの指したも…

30項 メンバ関数は、自分よりもアクセス制限がきついメンバへの非constポインタや参照を返さないようにしよう

メンバ関数は、自分よりもアクセス制限がきついメンバへの非constポインタや参照を返さないようにしようprotectedやprivateなメンバへのハンドルを返してしまうと、アクセス制限の意味がなくなってしまいます。 データを返すなら値返しで、ハンドルを返すな…

29項 内部データの「ハンドル」を返すのはやめよう

内部データの「ハンドル」を返すのはやめよう内部データのハンドルをそのまま返してしまうと、意図しないデータの書き換えが発生することがあります。 できる限り内部データのハンドルは返さないべきですが、返す必要があるときは、const指定をして返します。

28項 グローバルな名前空間は分割しよう

グローバルな名前空間は分割しよう

27項 暗黙のうちに生成される不要なメンバ関数は、明示的に使用を禁止しよう

暗黙のうちに生成される不要なメンバ関数は、明示的に使用を禁止しよう

26項 潜在的な多義性に対するガードを固めよう

潜在的な多義性に対するガードを固めよう関数をオーバロードしたときや、多重継承をしたときなどには、潜在的な多義性があります。 この問題を完全に防ぐのは不可能なので、注意を怠らないことが重要です。

25項 ポインタと数値型とにオーバロードするのは避けよう

25項 ポインタと数値型とにオーバロードするのは避けよう

24項 関数のオーバロードとデフォルトつきパラメータは、慎重に使い分けよう

関数のオーバロードとデフォルトつきパラメータは、慎重に使い分けよう

23項 オブジェクトを返さなければならないときに、リファレンスを返そうとがんばるのはやめよう

オブジェクトを返さなければならないときに、リファレンスを返そうとがんばるのはやめよう

22項 値渡しよりも、リファレンス渡しを使おう

値渡しよりも、リファレンス渡しを使おう

21項 使えるときは、必ずconstを使おう

"使えるときは、必ずconstを使おう"

20項 データメンバをpublicインタフェースに入れるのはやめよう

"データメンバをpublicインタフェースに入れるのはやめよう"タイトルの通り

19項 メンバ関数、非メンバ関数、friend関数を使い分けよう

"メンバ関数、非メンバ関数、friend関数を使い分けよう"

18項 クラスインターフェイスが完全かつ最小限になるまで頑張ろう

クラスインターフェイスが完全かつ最小限になるまで頑張ろうクライアントが普通やりたいようなことはなんでもできるようにし、完全なインターフェイスを実現します。 インターフェイスが多すぎると複雑で保守しづらいため、最小限のインタフェースを目指しま…

17項 operator=では、自分自身へ代入するケースをチェックしよう

operator=では、自分自身へ代入するケースをチェックしよう

16項 operator=では、全てのデータメンバに代入しよう

"operator=では、全てのデータメンバに代入しよう"

15項 operator=を書くときは、*thisへのリファレンスを返そう

"operator=を書くときは、*thisへのリファレンスを返そう"

14項 基底クラスには仮想デストラクタを持たせよう

"基底クラスには仮想デストラクタを持たせよう"

13項 初期化リストのメンバは、宣言した順に並べよう

"初期化リストのメンバは、宣言した順に並べよう"

12項 コンストラクタでは、代入よりも初期化を使おう

"コンストラクタでは、代入よりも初期化を使おう"

11項 メモリを動的に割り当てるクラスでは、コピーコンストラクタと代入演算子を宣言しよう

"メモリを動的に割り当てるクラスでは、コピーコンストラクタと代入演算子を宣言しよう"タイトルの通り、メモリを動的に割り当てるクラスでは、コピーコンストラクタと代入演算子を宣言します。 宣言を忘れてデフォルトの代入演算子が使われると、メモリ領域…

10項 operator newを書くなら、operator deleteも書こう

"operator newを書くなら、operator deleteも書こう"

09項 普通の形式のnewを隠蔽しないように注意しよう

"普通の形式のnewを隠蔽しないように注意しよう"

08項 operator newとoperator deleteを書くときは規約を守ろう

"operator newとoperator deleteを書くときは規約を守ろう"new,deleteをオーバロードするときには、規約を守る必要があります。

07項 メモリ不足に備えよう

"メモリ不足に備えよう"メモリ割り当て失敗時の対応を、set_new_handler()で定義できます。 set_new_handler()を使うためには、new.hをinculdeします。

06項 デストラクタでポインタメンバにdeleteを使うのを忘れないようにしよう

"デストラクタでポインタメンバにdeleteを使うのを忘れないようにしよう"メモリリークが蓄積されると、問題が起こります。 なので、デストラクタでポインタメンバをdeleteします。このとき、コンストラクタでポインタメンバに0を割り当てておくと、関係のな…

05項 newとdeleteのペアは同じ形式に揃えよう

"newとdeleteのペアは同じ形式に揃えよう"newで確保、deleteで解放 -> 正しく解放される。 new arrayで確保、deleteで解放 -> 不定。 newで確保、delete arrayで解放 -> 不定。 new arrayで確保、delete arrayで解放 -> 正しく解放される。なので、newとdele…

04項 コメントはC++スタイルで書こう

"コメントはC++スタイルで書こう"

03項 mallocとfreeよりも、newとdeleteを使おう

"mallocとfreeよりも、newとdeleteを使おう"newを使ってメモリを取得したとき、コンストラクタがあればそれを呼び出します。 deleteを使って解放したとき、デストラクタはあればそれを呼び出します。 malloc/freeは、何も呼び出しません。コンストラクタ/デ…

02項 stdio.hではなく、iostreamを使おう

"ではなく、を使おう"

01項 #defineではなく、constとinlineを使おう

C++の復習のために、EffectiveC++を読みます。 できれば一日1項は読みたい"#defineではなく、constとinlineを使おう"