classes objects c
C ++のクラスとオブジェクトの簡単な紹介。
クラスとオブジェクトは、C ++でのオブジェクト指向プログラミングの構成要素です。生きているか生きていないかを問わず、すべてのエンティティをオブジェクトとして表現し、C ++を使用してそれに応じてプログラムすることができます。したがって、車、机、人、鳥、動物などのエンティティをオブジェクトとして表すことができます。
クラスはオブジェクトよりも高いレベルであり、オブジェクトのカテゴリを表します。したがって、クラスは、オブジェクトの設計と詳細の概要を示す青写真として機能します。これには、オブジェクトを説明するために使用されるデータと、オブジェクトデータに作用できるさまざまなメソッドまたは関数が含まれます。
=> ここで簡単なC ++トレーニングシリーズに注意してください。
このチュートリアルでは、C ++のクラスとオブジェクトのすべての詳細と、それらのプログラムによる表現について説明します。
学習内容:
クラス
C ++のクラスは、特定のエンティティの青写真またはスケルトンと見なすことができます。クラスはユーザー定義のデータ型です。これには、その特定のエンティティおよびそのエンティティを操作する関数の一般的な情報またはデータが含まれています。
C ++構文では、キーワード「class」の後にクラスの名前を付けてクラスを定義します。
クラス名の後に中括弧で囲まれたクラスの詳細が続き、セミコロンで終了します。
次のブロックは、クラス定義の一般的な構文を示しています。
上記の表現に示されているように、クラスはpublic / protected / privateのようなアクセス指定子を持つことができます。データメンバーとメンバー関数を持つことができます。データと関数は、クラスのメンバーとして呼び出されます。デフォルトでは、メンバーはクラスに対してプライベートであるため、外部エンティティはこれらのメンバーにアクセスできません。
例えば、 車両は、モデル、色、シャーシ番号、average_speedなどのプロパティを持つ一般化されたクラスにすることができます。データメンバーに対してアクションを実行するchangeModel、acceleration、slowdownなどの機能を持つことができます。これらすべてのデータメンバーと関数を持つ「車両」という名前のクラスを定義できます。
すでに述べたように、クラスはエンティティの単なる青写真です。定義されている場合、メモリ内のスペースは必要ありません。クラスが機能するためには、クラスのメンバーを利用できるオブジェクトを定義する必要があります。
オブジェクト
クラス機能を使用するには、クラスをインスタンス化してオブジェクトを作成する必要があります。オブジェクトはクラスのインスタンスです。簡単に言えば、オブジェクトは型クラスの変数であると言えます。
オブジェクトを作成するための一般的な構文は次のとおりです。
classname object_name;
オブジェクトが作成されると、そのクラスのデータメンバーと関数にアクセスするために使用できます。
クラスのメンバー(データと関数)へのアクセスは、ドット(。)演算子を使用して行われます。ドット(。)演算子は、メンバーアクセス演算子とも呼ばれます。
objがオブジェクトの名前であり、クラスに関数「display()」がある場合、関数には「obj.display()」としてアクセスできます。
ただし、上記のステートメントには問題があります。関数が「public」の場合、オブジェクトとドット演算子を使用して関数display()にアクセスできます。
アクセス指定子
C ++では、クラス内のデータメンバーおよび関数へのアクセスは、アクセス指定子を使用してその特定のデータメンバーまたは関数に与えられたアクセスに依存します。
C ++は、次のアクセス指定子をサポートしています。
#1)プライベート
これは、C ++のクラスのデフォルトのアクセス指定子です。これは、クラスのメンバーにアクセス指定子が指定されていない場合、それはプライベートと見なされることを意味します。
メンバーがプライベートの場合、クラス外からアクセスすることはできません。オブジェクトとドット演算子も使用していません。プライベートデータメンバーには、クラスのメンバー関数を使用してのみアクセスできます。
最高の無料のPCチューンアップソフトウェア
ただし、このルールには例外があります。これについては、後のトピックで説明します。
#2)パブリック
クラスでパブリックとして定義されているデータメンバーまたは関数には、クラス外のすべてのユーザーがアクセスできます。これらのメンバーには、オブジェクトとドット演算子を使用してアクセスできます。
#3)保護
クラスの保護されたメンバーは、クラス自体とそのクラスの子クラスにアクセスできます。
このアクセス指定子は、特に継承の場合に使用されます。継承のトピックについて説明するときに、これについて詳しく説明します。
これらのアクセス指定子をよりよく理解するために、次の例を見てみましょう。
#include #include using namespace std; class ABC{ int var1 = 10; public: string name; void display() { cout<<'var1 ='< 出力:
var1 = 10
名前= sth
このプログラムには、int型のvar1がプライベートである2つのデータメンバーがあります(アクセス指定子は指定されていません。デフォルトはプライベートです)。もう1つのメンバーは、パブリックとして宣言されている文字列名です。これら両方のメンバーの値を表示するさらに別の関数表示があります。
main関数で、クラスABCのオブジェクトabcを宣言します。次に、データメンバーに値を設定し、オブジェクト「abc」を使用して関数の表示を呼び出します。
ただし、コンパイラがabc.var1 = 20という行を検出した場合。 「var1はプライベート変数です」というエラーが生成されます。
これは、クラス外のクラスのプライベートデータメンバーにアクセスできないためです。したがって、エラーがあります。ただし、関数内でアクセスできるため、表示関数でvar1の値を出力すると、エラーはスローされません。
したがって、プログラムの出力には、var1が宣言された初期値が表示されます。
これまで、クラス、オブジェクト、およびアクセス指定子の詳細を確認してきました。次に、サンプルクラスの学生の完全な例を取り上げます。このクラスには、student_id、student_name、student_ageのデータメンバーがあります。また、学生情報を読んだり、学生情報を表示したりするためのメンバー機能もあります。
読者が簡単に理解できるように、クラスのすべてのメンバーを公開として宣言しました。
次のプログラムは、完全な実装を示しています。
#include #include using namespace std; class student{ public: int student_id; string student_name; int student_age; void read_studentInfo(); void print_studentInfo() { cout<<'
Student ID : '<student_id; cout<>student_name; cout<>student_age; } int main() { student s1; s1.read_studentInfo(); s1.print_studentInfo(); }
出力:
学生IDを入力:1
student_name:abcと入力します
student_age:12と入力します
学生ID:1
学生名:abc
学生の年齢:12
したがって、上記で定義された完全なクラスがあります。唯一の顕著な違いは、クラス内で1つの関数「print_studentInfo」を定義したのに対し、他の関数「read_studentinfo」はクラス外で定義されていることです。これらは、メンバー関数をクラスに定義する2つの方法です。
外部で定義されている関数には、クラス内に宣言/プロトタイプがあることに注意してください。また、クラス外で スコープ解決演算子(::) 。次に、main関数で、学生クラスオブジェクトを作成し、関数を呼び出してデータを読み取って表示します。
コンストラクター
このチュートリアルのこれまでのところ、単純なオブジェクトを作成し、標準入力からこれらの値を読み取った後、main関数のクラスの各データメンバーに値を割り当てます。
このトピックでは、オブジェクトの作成中にオブジェクトを初期化するために使用される特別な関数を見ていきます。この特別な関数はコンストラクターと呼ばれます。
コンストラクターはクラスのメンバー関数ですが、次の点で通常のメンバー関数とは異なります。
- コンストラクターには戻り値がありません。つまり、コンストラクターは値を返しません。
- これは、クラスのパブリックメンバー関数です。
- これは、データメンバーを初期化し、クラスのオブジェクトを構築するために使用されます。
- オブジェクトの作成時にコンパイラーによって自動的に呼び出されます。
コンストラクターの種類
C ++は、次のタイプのコンストラクターをサポートします。
#1)デフォルトコンストラクタ
デフォルトのコンストラクターは基本コンストラクターであり、パラメーターはありません。デフォルトのコンストラクターを使用して、パラメーターなしで単純なオブジェクトを作成できます。
デフォルトのコンストラクターの構文は次のとおりです。
classname() { //constructor code }
クラスにデフォルトのコンストラクターがない場合、コンパイラーはそれを作成します。
#2)パラメーター化されたコンストラクター
パラメーター化されたコンストラクターは、クラスメンバーを初期化するために使用できるパラメーターリストを持つコンストラクターです。パラメータ化されたコンストラクタでオブジェクトを宣言するときは、初期値をパラメータとしてコンストラクタ関数に渡す必要があります。
パラメータ化されたコンストラクタ関数は、次のようになります。
classname(argument list){ //constructor code }
パラメータ化されたコンストラクタは、コンストラクタをオーバーロードするために使用されます。オーバーロードについては、後のトピックで詳しく説明します。
パラメータ化されたコンストラクタは、さまざまなオブジェクトのデータメンバーを初期化する目的で使用されます。その際、データメンバーのさまざまな値をさまざまなオブジェクトに渡すことができます。
#3)コピーコンストラクタ
C ++は、コピーコンストラクターと呼ばれる3番目のタイプのコンストラクターをサポートします。その一般的な形式は
クラス名(const classname&obj);
上記の宣言に示されているように、コピーコンストラクターでは、同じクラスの別のオブジェクトの値を使用して新しいオブジェクトが作成されます。コンストラクターに渡されるパラメーターは、新しいオブジェクトの構築に値が使用されるオブジェクトの定数参照です。
コピーコンストラクタは通常、次の状況で呼び出されます。
- クラスオブジェクトが値で返される場合。
- オブジェクトが引数として関数に渡され、値によって渡される場合。
- オブジェクトが同じクラスの別のオブジェクトから構築されている場合。
- コンパイラーによって一時オブジェクトが生成されたとき。
ただし、C ++コンパイラにはコピー操作を最適化する方法があるため、上記のすべての場合にコピーコンストラクタが確実に呼び出されることを保証することはできません。
コピーコンストラクターは、オブジェクト間でメンバーごとのコピーを実行します。デフォルトのコンストラクターと同様に、プログラムで指定しない場合、C ++コンパイラーはデフォルトのコピーコンストラクターを作成します。ただし、クラスにポインター、参照、リソースのランタイム割り当てなどの特定のデータメンバーがある場合は、独自のユーザー定義のコピーコンストラクターが必要です。
その理由は、デフォルトのコピーコンストラクタがデータメンバーの浅いコピーのみを実行するためです。つまり、両方のオブジェクトが同じメモリ位置を共有します。これは、単純な非ポインターデータメンバーには問題ありません。
ただし、ポインタやその他の動的データメンバーに関しては、データが新しいメモリ位置を指すようにする必要があります。これはディープコピーであり、ユーザー定義のコピーコンストラクターを使用してのみ実現できます。
以下に示すのは、3種類すべてのコンストラクターとオブジェクトの構築におけるそれらの使用法を実装する完全なC ++プログラムです。
#include #include using namespace std; class student{ public: int student_id; string student_name; int student_age; //default constructor student(){ student_id = 1; student_name = 'abc'; student_age = 10; } //parameterized constructor student(int id,string name,int age){ student_id = id; student_name = name; student_age = age; } //copy constructor student(const student& st){ student_id = st.student_id; student_name = st.student_name; student_age = st.student_age; } void print_studentInfo() { cout<<'
Student ID : '< 出力:
********** s **********
学生ID:1
学生名:abc
学生年齢:10
********** s2 **********
学生ID:2
学生名:xyz
学生の年齢:12
同じもののスクリーンショットを以下に示します。
モデムはどのように見えますか

このプログラムでは、前のプログラムで定義したものと同様のクラスの生徒を定義しました。違いは、関数を介して標準入力からデータメンバー値を読み取る代わりに、3つのコンストラクターを定義することです。
クラスが複数のコンストラクターを持つことは絶対に可能です。データメンバーを初期値に初期化するデフォルトのコンストラクターがあります。次に、初期値をパラメーターとしてコンストラクターに渡すパラメーター化されたコンストラクターを定義します。
次に、学生クラスのオブジェクトへの定数参照を渡すコピーコンストラクターを定義します。
main関数では、3つのコンストラクターを使用して3つのオブジェクトを個別に作成します。最初のオブジェクトsは、デフォルトのコンストラクターを使用して作成されます。 2番目のオブジェクトs1はパラメーター化されたコンストラクターを使用して作成され、3番目のオブジェクトs2はコピーコンストラクターを使用して作成されます。
コンピューティングシステムのテストの種類は次のとおりです。
3番目のオブジェクトs2の作成に注意してください。ここでは、作成済みのオブジェクトs1を新しいオブジェクトs2に割り当てます。したがって、既存のオブジェクトを使用して新しいオブジェクトを作成すると、コンパイラによってコピーコンストラクタが呼び出されます。
代入演算子
代入演算子(=)を使用して、あるオブジェクトの値を別のオブジェクトに割り当てることもできます。この場合、s1 = sのようなステートメントがあります。
コピーコンストラクターと代入演算子の違いは、コピーコンストラクターが完全に新しいオブジェクトを構築するのに対し、代入演算子はRHS上のオブジェクトのメンバーの値をLHS上のオブジェクトの値に割り当てるだけであるということです。これは、代入演算子の両側にあるオブジェクトが、代入の前に存在している必要があることを意味します。
駆逐艦
デストラクタもコンストラクタのような特別な関数ですが、コンストラクタとは正反対の機能を実装しています。コンストラクタはオブジェクトの作成に使用されますが、デストラクタはオブジェクトの破棄または削除に使用されます。
デストラクタの特徴には次のものがあります。
- デストラクタ名はクラス名と同じですが、チルダ(〜)記号で始まります。
- デストラクタには戻り値の型はありません。
- デストラクタには引数がありません。
- 1つのクラスに存在できるデストラクタは1つだけです。
- クラスにデフォルトのデストラクタを提供できない場合、コンパイラは常にデフォルトのデストラクタを作成します。
デストラクタの一般的な構文は次のとおりです。
~classname(){ //cleanup code }
クラスのデストラクタは通常、次の状況で呼び出されます。
- オブジェクトがスコープ外になると、クラスデストラクタが自動的に呼び出されます。
- 同様に、デストラクタはプログラムの実行が終了したときに呼び出されます。これは、すべてのオブジェクトも存在しなくなることを意味します。したがって、各オブジェクトのデストラクタが呼び出されます。
- クラスのデストラクタは、オブジェクトを削除するための「削除」演算子が実行されたときにも呼び出されます。
- オブジェクトの機能が完了した後、デストラクタを明示的に呼び出して、クリーンアップアクティビティを実行することもできます。
以下の例は、デストラクタの動作を示しています。
#include using namespace std; class sample{ public: sample(){ cout<<'Constructor::sample called'< 出力:
コンストラクター::サンプルと呼ばれる
これはサンプルクラスです
デストラクタ::〜サンプルが呼び出されました
上記の出力のスクリーンショットを以下に示します。

コンストラクタ、デストラクタ、および関数表示を定義したクラスサンプルを定義しました。 main関数では、クラスsampleのオブジェクトobjを作成してから、このオブジェクトのdisplay関数を呼び出します。
その後、リターン0が実行されます。出力では、表示関数が戻り、プログラム制御がステートメントreturn 0に到達した瞬間に、デストラクタが実行されていることがわかります。これは、オブジェクトがスコープから外れた瞬間に実行されることを意味します。
「これ」ポインタ
C ++は、「this」ポインタと呼ばれる、オブジェクトに関連する特別な概念を使用します。 「this」ポインタは常に現在のオブジェクトを指します。したがって、状況に応じて、現在のオブジェクトを参照する必要がある場合は常に、「this」ポインタを使用します。
クラスのインスタンス、つまりオブジェクトが作成されるたびに、クラスのデータメンバーの個別のコピーがオブジェクト用に作成されることがわかっています。しかし、クラスのメンバー関数に関しては、すべてのオブジェクトが同じコピーを共有します。
では、1つ以上のオブジェクトがメンバー関数に同時にアクセスする場合、メンバー関数によって適切なデータメンバーがアクセスおよび変更されるようにするにはどうすればよいでしょうか。
これは、「this」ポインタが機能する場所です。コンパイラーは、関数名が「this」の暗黙のポインターを渡します。これは「this」ポインタと呼ばれます。
「this」ポインタは、すべてのメンバー関数呼び出しに非表示の引数として渡されます。通常はローカル変数です。したがって、「this」ポインタは定数ポインタであり、その内容は現在のオブジェクトのメモリアドレスです。
このポインターは、非静的メンバー関数でのみ使用可能であり、静的関数では使用できないことに注意してください。これは、オブジェクトを使用して静的関数にアクセスする必要がないためです。クラス名を使用して直接アクセスできます。
通常、同じ名前を共有するメンバー変数を初期化するためにメンバー変数とパラメーターが渡される状況では、「this」ポインターを使用します。関数から現在のオブジェクトを返す必要がある場合にも使用します。
以下の「this」ポインタのデモンストレーションを見てみましょう。
#include using namespace std; class Sample { private: int num; char ch; public: Sample &setParam(int num, char ch){ this->num =num; this->ch = ch; return *this; } void printValues(){ cout<<'num = '< 出力:
num = 100
ch = A
上記のプログラムには、2つのデータメンバーのnumとchを持つSampleというクラスがあります。同じ名前、num、chのパラメーターを渡して、メンバー変数の値を設定するメンバー関数setParamがあります。
関数内で、これらの値を、このポインターによって示される現在のオブジェクトメンバー変数に割り当てます。値が設定されると、現在のオブジェクト「this」が関数から返されます。
main関数では、最初にSampleクラスobjのオブジェクトを作成し、setParam関数を呼び出して値を設定してから、printValues関数を呼び出して値を出力します。
結論
このチュートリアルでは、C ++でのOOPの基本的な構成要素を学習しました。クラスとオブジェクトを理解することは、まず、C ++のOOPの主要な要件です。また、コンストラクタとデストラクタについて、例を使用して詳細に学習しました。
次のチュートリアルでは、C ++の初期化子リストについて学習します。
=> ここで簡単なC ++トレーニングシリーズに注意してください。
推奨読書