No.1ベストアンサー
- 回答日時:
>クラス外でメンバ関数を定義するメリットを教えてください。
一言で言えば、オブジェクト指向の特長の一つである「カプセル化」を効果的に行えます。
小規模で単純な構造のプログラムならば、C++のクラス定義を使うメリットはあまりなく、C言語の文法で十分です。
クラス定義のメリットが生きてくるのは、プログラムの規模が大きくなってきたときです。
・クラスを複数の場所で使いまわす(再利用)
・プログラムを複数の人で分担して開発する
・モジュール化することで、全体の規模が大きくなっても開発・保守しやすい構造にする
これらのためには、クラスを外部から使う時のインターフェース(クラス定義)と、クラスの内部の実装(メンバ関数の実装)を分離し、クラスを外部から使う時は、インターフェースのみを意識すれば良いようにしておく方が得策です。
クラス内でメンバ関数を定義してしまうと、インターフェースとその実装が一つの場所に混在することになってしまい、例えばクラスを外部から使いたいだけなのに、その際に見る必要のない、メンバ関数の実装が大量に書かれている中から、インターフェースに相当する情報を読み取らなければならず、作業の効率が落ちてしまいます。クラスの全体構造を理解することも大変になりますし、その過程でミスが入り込む(バグの原因)リスクも高くなります。
また、クラスをライブラリとして配布する場合に、メンバ関数の実装はコンパイル済みのライブラリ、インターフェースは、メンバ関数の宣言のみを含むクラス定義のヘッダファイルとして配布することで、実装のソースコードを見せずに配布することができますし、勝手に実装が変更されて不具合の原因になるような事故を防ぐことができます。
なお、
>クラス内でメンバ関数を定義するとインライン関数になると書いてあったのですが
これは、正確には少し違っていまして、メンバ関数宣言にinlineのキーワードをつけておくと、これがコンパイラへの「ヒント」になるだけです。
コンパイルの際に、実際にインライン展開されるか否かは、コンパイラ次第で、必ずインライン展開されるとは限りません。
メンバ関数の実装内容によっては、原理的にどうやってもインライン展開できない場合もあります。
インライン展開されると、関数の呼び出しオーバーヘッドがなくなる分、処理は高速になりますが、その一方で実行コードの量は増え、メモリは多く消費します。
どちらが良いかはケースによりますが、現在の非常に高性能なプロセッサで、これが処理速度の差となって現れるケースは非常に限られていると思います。
逆にインラインで書くことは、コードの保守性を下げる原因になりますので、基本的にはむしろ、むやみにやらない方が良いでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
FriendとPublicの違い。。。
-
ダイアログクラスのコントロー...
-
C言語(BCB)で双方向リストを...
-
既定のコンストラクタがない?
-
C#のクラス設計について教えて...
-
DLLからEXEのクラスを呼び出す...
-
このコンパイルエラーの意味に...
-
クラスのメンバになってくれま...
-
ダイアログ表示時にチェックボ...
-
【VC++】クラスの追加方法について
-
質問です!とても基本的なこと...
-
【ASP.NET】 独自で作成したク...
-
C#文字でクラスのメンバにアクセス
-
IncludeではなくClassで宣言す...
-
スプラッシュコントロールの挿...
-
エディットコントロールでEnter...
-
MFCアプリのコマンドラインでパ...
-
WindowsAPIのリストビューの...
-
クラスのアドレスを引数として...
-
エディットコントロールのイベ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
(UWSC) 「#32770」の意味わかり...
-
クラスのアドレスを引数として...
-
ダイアログ表示時にチェックボ...
-
エディットコントロールでEnter...
-
イベントにAddHandlerされてい...
-
【ASP.NET】 独自で作成したク...
-
DebugクラスとTraceクラスの違い
-
MFCのCListCtrlでスクロールを検出
-
C++ protectedにアクセス不可
-
C++で継承元のクラスの代入演算...
-
継承したクラスを、継承元のク...
-
OnInitDialog()の関数の組み込み方
-
ダイアログクラスのコントロー...
-
MessageBoxを継承したい
-
DataGridViewのセルに斜線を引...
-
このコンパイルエラーの意味に...
-
MFCアプリのコマンドラインでパ...
-
C#のクラス設計について教えて...
おすすめ情報