No.1ベストアンサー
- 回答日時:
>クラス外でメンバ関数を定義するメリットを教えてください。
一言で言えば、オブジェクト指向の特長の一つである「カプセル化」を効果的に行えます。
小規模で単純な構造のプログラムならば、C++のクラス定義を使うメリットはあまりなく、C言語の文法で十分です。
クラス定義のメリットが生きてくるのは、プログラムの規模が大きくなってきたときです。
・クラスを複数の場所で使いまわす(再利用)
・プログラムを複数の人で分担して開発する
・モジュール化することで、全体の規模が大きくなっても開発・保守しやすい構造にする
これらのためには、クラスを外部から使う時のインターフェース(クラス定義)と、クラスの内部の実装(メンバ関数の実装)を分離し、クラスを外部から使う時は、インターフェースのみを意識すれば良いようにしておく方が得策です。
クラス内でメンバ関数を定義してしまうと、インターフェースとその実装が一つの場所に混在することになってしまい、例えばクラスを外部から使いたいだけなのに、その際に見る必要のない、メンバ関数の実装が大量に書かれている中から、インターフェースに相当する情報を読み取らなければならず、作業の効率が落ちてしまいます。クラスの全体構造を理解することも大変になりますし、その過程でミスが入り込む(バグの原因)リスクも高くなります。
また、クラスをライブラリとして配布する場合に、メンバ関数の実装はコンパイル済みのライブラリ、インターフェースは、メンバ関数の宣言のみを含むクラス定義のヘッダファイルとして配布することで、実装のソースコードを見せずに配布することができますし、勝手に実装が変更されて不具合の原因になるような事故を防ぐことができます。
なお、
>クラス内でメンバ関数を定義するとインライン関数になると書いてあったのですが
これは、正確には少し違っていまして、メンバ関数宣言にinlineのキーワードをつけておくと、これがコンパイラへの「ヒント」になるだけです。
コンパイルの際に、実際にインライン展開されるか否かは、コンパイラ次第で、必ずインライン展開されるとは限りません。
メンバ関数の実装内容によっては、原理的にどうやってもインライン展開できない場合もあります。
インライン展開されると、関数の呼び出しオーバーヘッドがなくなる分、処理は高速になりますが、その一方で実行コードの量は増え、メモリは多く消費します。
どちらが良いかはケースによりますが、現在の非常に高性能なプロセッサで、これが処理速度の差となって現れるケースは非常に限られていると思います。
逆にインラインで書くことは、コードの保守性を下げる原因になりますので、基本的にはむしろ、むやみにやらない方が良いでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- C言語・C++・C# 課題でどうしてもわからない問題があったので教えてほしいです、、 メンバ関数add_accept_st 3 2022/06/04 12:23
- C言語・C++・C# C言語 2 2022/07/21 00:02
- JavaScript オブジェクト配列の各メンバを任意の式で評価して、その評価値が最大のオブジェクトを返す関数はありますか 2 2023/05/20 15:02
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- 物理学 内積 3 2022/12/04 18:41
- 数学 関数1/(1+√x)のx=1における微分係数を微分の定義に従って求めよ。 これについて教えていただき 5 2023/07/22 19:08
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- 数学 逆関数 5 2022/10/19 15:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
DLLからEXEのクラスを呼び出す...
-
(UWSC) 「#32770」の意味わかり...
-
MFCアプリのコマンドラインでパ...
-
ダイアログ表示時にチェックボ...
-
エディットコントロールでEnter...
-
C++/CLIからC++の呼び出しで例外
-
C++ protectedにアクセス不可
-
MRUの一時回避 VC++2008 MFC
-
CMainFrameクラスの使い方
-
IncludeではなくClassで宣言す...
-
このコンパイルエラーの意味に...
-
【C++】vectorについて
-
C#のクラス設計について教えて...
-
イベントにAddHandlerされてい...
-
VC++ リストボックスにデータを...
-
クラスのアドレスを引数として...
-
オブジェクト指向 集約の実装...
-
SetTimerの行でアサートエラー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
イベントにAddHandlerされてい...
-
クラスのアドレスを引数として...
-
ダイアログ表示時にチェックボ...
-
(UWSC) 「#32770」の意味わかり...
-
エディットコントロールのイベ...
-
エディットコントロールでEnter...
-
WindowsAPIのリストビューの...
-
CMainFrameクラスの使い方
-
DebugクラスとTraceクラスの違い
-
MessageBoxを継承したい
-
C++ protectedにアクセス不可
-
このコンパイルエラーの意味に...
-
MFCのドラッグ&ドロップについて
-
MFCアプリのコマンドラインでパ...
-
【ASP.NET】 独自で作成したク...
-
C#で通常のbuttonコントロール...
-
ダイアログクラスのコントロー...
-
派生クラスから基本クラスprote...
おすすめ情報