C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++が完全なオブジェクト指向言語ではない理由とは?部分的なオブジェクト指向の理由を解説

はじめに

オブジェクト指向プログラミング言語の基本的な特徴として、継承(Inheritance)カプセル化(Encapsulation)ポリモーフィズム(Polymorphism)の3つが挙げられます。これらの機能を完全にサポートする言語が「オブジェクト指向プログラミング言語」と呼ばれます。

C++はこれらの3つの機能を備えていますが、完全にはサポートしていません。そのため、C++は「部分的なオブジェクト指向言語」と分類されることがあります。ここでは、C++が完全なオブジェクト指向言語とみなされない理由を詳しく見ていきましょう。

理由1:main()関数がクラスの外に存在する

C++ではプログラムの実行を開始するためにmain()関数が必要ですが、このmain()関数はクラスの内部に存在する必要がありません。つまり、C++ではクラスを使わずにコードを書くことが可能です。

一方、Javaのような純粋なオブジェクト指向言語では、ファイル名と同じ名前のクラスが必ず1つ必要であり、main()関数もそのクラスの内部に定義しなければなりません。この違いが、C++のオブジェクト指向性を弱める一因となっています。

理由2:グローバル変数が使用できる

C++ではグローバル変数を定義でき、プログラムのどこからでもアクセス可能です。しかし、これはデータの完全なプライバシーを保証するものではありません。誰でもアクセスや変更を制限されることなく行えるため、カプセル化の概念が部分的にしか実現されないのです。

対照的にJavaでは、変数はクラス内で宣言し、アクセス修飾子(private、protected、publicなど)を付けることで、データへのアクセスを厳密に制御できます。

理由3:フレンド関数の存在

C++にはフレンド関数(friend関数)という仕組みがあります。フレンド関数を使用すると、あるクラスのprivateメンバーやprotectedメンバーに外部からアクセスできるようになります。

これはカプセル化による情報隠蔽の原則に反するため、オブジェクト指向言語の概念に違反しているとも言えます。なお、Javaにはフレンド関数に相当する機能は存在しません。

まとめ

C++は継承・カプセル化・ポリモーフィズムを備えているものの、以下の点から「完全なオブジェクト指向言語」とは言えません。

  • main()関数がクラス外に存在でき、クラスなしでコードを書ける
  • グローバル変数によりカプセル化が不完全になる
  • フレンド関数によってカプセル化の原則が破られる

これらの理由から、C++は「部分的なオブジェクト指向言語」、あるいは「マルチパラダイム言語」として分類されるのです。C言語との互換性を保ちながら手続き型プログラミングも可能にする柔軟性は、C++の大きな特徴であり、強みでもあります。

  1. C++プログラミング言語とは?特徴と基本をわかりやすく解説

    C++は、1979年にベル研究所のビャーネ・ストロヴストルップ(Bjarne Stroustrup)によって開発されたプログラミング言語です。高水準言語と低水準言語の両方の特徴を兼ね備えていることから、「中級言語(ミドルレベル言語)」と位置づけられています。C++はC言語のスーパーセットであり、事実上すべての有効なCプログラムは、そのまま有効なC++プログラムとして扱えます。さらに、WindowsやmacOS、各種UNIXなど、幅広いプラットフォームで動作する点も大きな魅力です。システム開発からゲーム、組み込みソフトウェアまで、多岐にわたる分野で長年活用され続けています。C++の主な言語特性C

  2. C/C++からPythonオブジェクトを操作する方法(Cython埋め込みの実践ガイド)

    C/C++からPythonオブジェクトを使うには?CやC++のプログラムからPythonオブジェクトを直接生成・操作したい場合、Cythonを利用するのが最も手軽な方法の一つです。ここでは、シンプルなPythonクラスをCythonでラップし、C言語側に組み込んで(埋め込んで)呼び出す例を紹介します。C++の場合も手順はほぼ同じで、コンパイル時に--cplusオプションを付けるだけで対応できます。ステップ1:Pythonクラスと公開関数を定義する(pycls.pyx)まず、ラップ対象となるPythonクラスと、C側から呼び出せるようにするためのcdef public関数を定義したファイル「py