C++ クラスとオブジェクト
C++ のクラス オブジェクト指向プログラミングにつながる構成要素です。これはユーザー定義のデータ型であり、独自のデータ メンバーとメンバー関数を保持し、そのクラスのインスタンスを作成することでアクセスして使用できます。 C++ クラスはオブジェクトの設計図のようなものです。例: 次のクラスを考えてみましょう。 車 。異なる名前やブランドを持つ多くの車が存在する可能性がありますが、それらはすべて、次のようないくつかの共通の特性を共有します。 4輪 、 制限速度 、 走行距離範囲、 ここでは、Car がクラスであり、ホイール、制限速度、走行距離がそのプロパティです。
- クラスは、データ メンバーとメンバー関数を持つユーザー定義のデータ型です。
- データ メンバーはデータ変数であり、メンバー関数はこれらの変数を一緒に操作するために使用される関数です。これらのデータ メンバーとメンバー関数は、クラス内のオブジェクトのプロパティと動作を定義します。
- 上記のクラスの例では、 車 、データメンバーは次のようになります 制限速度 、 マイレージ、 など、メンバー関数は次のようにすることができます。 ブレーキをかける 、 速度が増し、 等
アン 物体 クラスのインスタンスです。クラスが定義されるとき、メモリは割り当てられませんが、クラスがインスタンス化される (つまり、オブジェクトが作成される) ときにメモリが割り当てられます。
クラスの定義とオブジェクトの宣言
クラスは、C++ でキーワード class の後にクラス名を付けて定義します。クラスの本体は中括弧内で定義され、末尾のセミコロンで終了します。
オブジェクトの宣言
クラスを定義すると、オブジェクトの仕様のみが定義されます。メモリやストレージは割り当てられません。クラスで定義されたデータを使用し、関数にアクセスするには、オブジェクトを作成する必要があります。
構文
ClassName ObjectName;
データメンバーとメンバー関数へのアクセス : クラスのデータ メンバーとメンバー関数には、オブジェクトでドット(‘.’) 演算子を使用してアクセスできます。たとえば、オブジェクトの名前が オブジェクト 次の名前のメンバー関数にアクセスしたいとします。 名前を印刷する() それなら書かなければなりません obj.printName() 。
データメンバーへのアクセス
パブリック データ メンバーにも同じ方法でアクセスできますが、オブジェクトからプライベート データ メンバーに直接アクセスすることは許可されていません。データ メンバーへのアクセスは、そのデータ メンバーのアクセス制御のみに依存します。このアクセス制御は、C++ の Access 修飾子によって提供されます。アクセス修飾子は 3 つあります。 パブリック、プライベート、そして保護された 。
C++
// C++ program to demonstrate accessing of data members> #include> using> namespace> std;> class> Geeks {> > // Access specifier> public> :> > // Data Members> > string geekname;> > // Member Functions()> > void> printname() { cout < <> 'Geekname is:'> < < geekname; }> };> int> main()> {> > // Declare an object of class geeks> > Geeks obj1;> > // accessing data member> > obj1.geekname => 'Abhi'> ;> > // accessing member function> > obj1.printname();> > return> 0;> }> |
出力
Geekname is:Abhi
クラスのメンバー関数
メンバー関数を定義するには 2 つの方法があります。
- クラス定義の内部
- クラス定義外
クラス定義の外でメンバー関数を定義するには、 スコープ解決:: 演算子 クラス名と関数名も一緒に。
C++
// C++ program to demonstrate function> // declaration outside class> > #include> using> namespace> std;> class> Geeks> {> > public> :> > string geekname;> > int> id;> > > // printname is not defined inside class definition> > void> printname();> > > // printid is defined inside class definition> > void> printid()> > {> > cout < <> 'Geek id is: '> < } }; // Definition of printname using scope resolution operator :: void Geeks::printname() { cout < <'Geekname is: ' < } int main() { Geeks obj1; obj1.geekname = 'xyz'; obj1.id=15; // call printname() obj1.printname(); cout < < endl; // call printid() obj1.printid(); return 0; }> |
出力
Geekname is: xyz Geek id is: 15
クラス定義内で定義されたすべてのメンバー関数はデフォルトで 列をなして ただし、キーワード inline を使用して非クラス関数をインライン化することもできます。インライン関数は実際の関数であり、プリプロセッサ マクロと同様にコンパイル中にあらゆる場所にコピーされるため、関数呼び出しのオーバーヘッドが軽減されます。
注記: を宣言する フレンド機能 非メンバー関数へのプライベート アクセスを許可する方法です。
コンストラクター
コンストラクター 特別なクラスのメンバーであり、そのクラスのオブジェクトがインスタンス化されるたびにコンパイラーによって呼び出されます。コンストラクターはクラスと同じ名前を持ち、クラス定義の内部または外部で定義できます。コンストラクターには 3 種類あります。
- デフォルトのコンストラクター
- パラメータ化されたコンストラクタ
- コンストラクターのコピー
C++
// C++ program to demonstrate constructors> #include> using> namespace> std;> class> Geeks> {> > public> :> > int> id;> > > //Default Constructor> > Geeks()> > {> > cout < <> 'Default Constructor called'> < < endl;> > id=-1;> > }> > > //Parameterized Constructor> > Geeks(> int> x)> > {> > cout < <> 'Parameterized Constructor called '> < < endl;> > id=x;> > }> };> int> main() {> > > // obj1 will call Default Constructor> > Geeks obj1;> > cout < <> 'Geek id is: '> < // obj2 will call Parameterized Constructor Geeks obj2(21); cout < <'Geek id is: ' < return 0; }> |
出力
Default Constructor called Geek id is: -1 Parameterized Constructor called Geek id is: 21
あ コピーコンストラクター 既存のオブジェクトの正確なコピーである新しいオブジェクトを作成します。コンパイラは、デフォルトのコピー コンストラクターをすべてのクラスに提供します。
構文:
class-name (class-name &){} 駆逐艦
デストロイヤー これは、オブジェクトのスコープが終了するときにコンパイラによって呼び出されるもう 1 つの特別なメンバー関数です。
C++
// C++ program to explain destructors> #include> using> namespace> std;> class> Geeks> {> > public> :> > int> id;> > > //Definition for Destructor> > ~Geeks()> > {> > cout < <> 'Destructor called for id: '> < < id < } }; int main() { Geeks obj1; obj1.id=7; int i = 0; while ( i <5 ) { Geeks obj2; obj2.id=i; i++; } // Scope for obj2 ends here return 0; } // Scope for obj1 ends here> |
出力
Destructor called for id: 0 Destructor called for id: 1 Destructor called for id: 2 Destructor called for id: 3 Destructor called for id: 4 Destructor called for id: 7
興味深い事実 (珍しい既知の概念)
クラスの最後にセミコロンを付けるのはなぜですか?
多くの人は、これは基本的な構文であり、cpp でのルール定義に従ってクラスの最後にセミコロンを付ける必要があると言うかもしれません。ただし、クラスの最後にセミコロンがある主な理由は、ユーザーがクラスの最後にクラスのインスタンスを作成しようとしているかどうかをコンパイラがチェックするためです。
はい、構造体や共用体と同じように、末尾のセミコロンの直前にクラスのインスタンスを作成することもできます。その結果、実行がその行に到達すると、クラスが作成され、インスタンスにメモリが割り当てられます。
C++
#include> using> namespace> std;> > class> Demo{> > int> a, b;> > public> :> > Demo()> // default constructor> > {> > cout < <> 'Default Constructor'> < < endl;> > }> > Demo(> int> a,> int> b):a(a),b(b)> //parameterised constructor> > {> > cout < <> 'parameterized constructor -values'> < < a < <> ' '> < < b < < endl;> > }> > }instance;> > > int> main() {> > > return> 0;> }> |
出力
Default Constructor
インスタンスという名前で Demo のクラス インスタンスを作成したことがわかります。その結果、デフォルト コンストラクターが呼び出されたという出力が表示されます。
同様に、ここに値を渡すだけでパラメータ化されたコンストラクターを呼び出すこともできます。
C++
#include> using> namespace> std;> > class> Demo{> > public> :> > int> a, b;> > Demo()> > {> > cout < <> 'Default Constructor'> < < endl;> > }> > Demo(> int> a,> int> b):a(a),b(b)> > {> > cout < <> 'parameterized Constructor values-'> < < a < <> ' '> < < b < < endl;> > }> > > > }instance(100,200);> > > int> main() {> > > return> 0;> }> |
出力
parameterized Constructor values-100 200
したがって、セミコロンの直前にインスタンスを作成することで、クラスのインスタンスを作成できます。
関連記事:
- C++ における多重継承
- 純粋な仮想デストロイヤー
- C++ クイズ