クラスとオブジェクト
1プロセス指向およびオブジェクト指向の予備的理解
C言語はプロセス指向であり、プロセスに焦点を合わせ、問題を解決するためのステップを分析し、関数呼び出しを通じて問題を徐々に解決します。
C ++は、オブジェクト指向に基づいており、オブジェクトに焦点を合わせ、モノを異なるオブジェクトに分割し、オブジェクト間の相互作用によって完成させます。
タイプ2
2.1クラスの導入
C言語では、構造体で定義できるのは変数のみです。C++では、構造体で変数を定義できるだけでなく、関数も定義できます。
struct Student
{
void SetStudentInfo(const char* name, const char* gender, int age)
{
strcpy(_name, name);
strcpy(_gender, gender);
_age = age;
}
void PrintStudentInfo()
{
cout<<_name<<" "<<_gender<<" "<<_age<<endl;
}
char _name[20];
char _gender[3];
int _age;
};
int main()
{
Student s;
s.SetStudentInfo("Peter", "男", 18);
return 0;
}
上記の構造の定義では、C ++ではなくクラスを使用することを好みます。
2.2クラス定義
class className
{
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
Classはクラスを定義するためのキーワード、ClassNameはクラスの名前、{}はクラスの本体です。クラス定義の終了後のセミコロンに注意してください。
クラス内の要素はクラスのメンバーと呼ばれます。クラス内のデータはクラスの属性またはメンバー変数と呼ばれ、クラス内の関数はクラスのメソッドまたはメンバー関数と呼ばれます。
クラスの2つの定義形式
- 宣言と定義はすべてクラス本体に配置されます。注:メンバー関数がクラスで定義されている場合、コンパイラーはそれをインライン関数として扱う場合があります
。- 宣言は.hファイルに配置され、クラス定義は.cppファイルに配置されます。
通常の状況では、2番目の方法を採用することがより望ましいです。
2.3クラスの範囲
クラスは新しいスコープを定義し、クラスのすべてのメンバーはクラスのスコープ内にあります。クラス本体の外部でメンバーを定義するには、::スコープリゾルバーを使用して
、メンバーが属するクラスドメインを指定する必要があります。
class Person
{
public:
void PrintPersonInfo();
private:
char _name[20];
char _gender[3];
int _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
cout<<_name<<" "_gender<<" "<<_age<<endl; }
2.4クラスのインスタンス化
クラスタイプでオブジェクトを作成するプロセスは、クラスのインスタンス化と呼ばれます。
1.クラスは単なるモデルのようなものであり、クラスのメンバーを制限し、クラスを定義し、それを格納するための実際のメモリスペースを割り当てません
。2。クラスは複数のオブジェクトをインスタンス化でき、インスタンス化されたオブジェクトは実際のオブジェクトを占有します。物理スペース、*クラスメンバー変数のみを格納します
3たとえば。クラスデザインのように、家を建てるための実際の建築計画のようにオブジェクトをインスタンス化するクラスは、何を
何をデザインする必要があるだけですが、建物はエンティティではなく、同じカテゴリは実際に格納できる缶のデザイン例にすぎませんデータと
物理的なスペースを占める
2.5クラスアクセス修飾子とカプセル化
2.5.1アクセス修飾子
C ++は、カプセル化の方法を実現します。クラスを使用してオブジェクトの属性とメソッドを組み合わせ、オブジェクトをより完全にし、アクセス許可を通じて
外部ユーザーにそのインターフェイスを選択的に提供します。
アクセス修飾子
- 公衆
- 保護された
- 民間
アクセス修飾子の説明
- パブリックによって変更されたメンバーは、クラスの外部から直接アクセスできます
- 保護されたメンバーとプライベートに変更されたメンバーは、クラスの外部から直接アクセスできません(保護されたメンバーとプライベートはここで類似しています)
- アクセス権の範囲は、アクセス修飾子が表示される場所から始まり、次のアクセス修飾子が表示されるまでです。
- クラスのデフォルトのアクセス許可はprivateであり、structはpublicです(structはCと互換性があるため)。
注:アクセス修飾子はコンパイル時にのみ役立ちます。データがメモリにマップされた後は、アクセス修飾子に違いはありません。
C ++の構造体とクラスの違いは何ですか?
C ++はC言語と互換性がある必要があるため、C ++の構造体を構造体として使用できます。さらに、C ++のstructを使用してクラスを定義することもできます。
クラスを定義するクラスと同じですが、構造体メンバーのデフォルトのアクセス方法がパブリックであるのと、クラスのデフォルトのアクセス方法が構造体メンバーの
プライベートである点が異なります。
2.5.2パッケージ
オブジェクト指向の3つの特性:カプセル化、継承、およびポリモーフィズム。
クラスとオブジェクトの段階では、クラスのカプセル化特性のみを調査しますが、カプセル化とは何ですか?
カプセル化:データとデータを有機的に操作するメソッドを組み合わせ、オブジェクトのプロパティと実装の詳細を非表示にし、オブジェクトと
対話するためにインターフェイスを外部にのみ公開します。
カプセル化は本質的に一種の管理です。テラコッタの戦士をどのように管理するのでしょうか。たとえば、何も残っていない場合、兵馬俑は自由に破壊されます。そこで、私たちは
最初に兵馬俑をカプセル化する家を建てました。しかし、私たちの目的はすべてカプセル化されており、他の人に見られないようにしています。そのため、チケット販売
チャネルを開設し、チケットを購入してパッケージを突破し、合理的な監督メカニズムの下で入場することができます。クラスについても同じことが言えます。クラスのデータとメソッドを使用してそれらをカプセル化します。
他の人に見られたくないので、私たちは保護された/プライベートを使用してメンバーをカプセル化します。いくつかの共有メンバー関数を開いて、メンバーに合理的にアクセスします
。したがって、カプセル化は本質的に一種の管理です。
2.6クラスのオブジェクトサイズの計算
2.6.1クラスオブジェクトの保存
メンバー変数のみを保存します。共通のコードに格納されているメンバー関数
は、クラスサイズが実際にはクラスの「メンバー変数」であり、もちろん、メモリの配置についても、空のクラスのサイズに注意してください。空のアナロジーは
より特別です。コンパイラクラスを一意に識別するために、空のクラスにバイトが与えられます。
構造のメモリアライメントルールへの参照:https://blog.csdn.net/CZHLNN/article/details/110006248
2.7クラスメンバー関数のこのポインタ
2.7.1このポインタからの導き
まず、日付クラスDateを定義しましょう
class Date
{
public :
void Display ()
{
cout <<_year<< "-" <<_month << "-"<< _day <<endl;
}
void SetDate(int year , int month , int day)
{
_year = year;
_month = month;
_day = day;
}
private :
int _year ; // 年
int _month ; // 月
int _day ; // 日
};
int main()
{
Date d1, d2;
d1.SetDate(2018,5,1);
d2.SetDate(2018,7,1);
d1.Display();
d2.Display();
return 0; }
上記のクラスの場合、次のような問題
があります。Dateクラスには2つのメンバー関数SetDateとDisplayがあります。関数本体の異なるオブジェクトは区別されません。s1がSetDate関数を呼び出すと、関数
はどのようにしてs1オブジェクトを設定する必要がありますか?s2オブジェクトを設定する代わりに?
C ++、このポインタを導入することでこの問題を解決します。つまり、「非静的メンバー関数」ごとにC ++コンパイラがポインタ参照を非表示の
番号に追加し、現在のオブジェクト(関数のオブジェクト)へのポインタを追加します。関数ランタイムを呼び出します)、関数本体のすべてのメンバー変数操作は、この
ポインターを介してアクセスされます。すべての操作がユーザーに対して透過的であるというだけです。つまり、ユーザーはそれを渡す必要がなく、コンパイラーが自動的に完了します。
2.7.2このポインタの特性
1このポインタの型:class type * const
2「メンバー関数」内でのみ使用できます
。3このポインタは実際にはメンバー関数の正式なパラメータです。オブジェクトがメンバー関数を呼び出すと、オブジェクトアドレスが渡されます。実際のパラメータとして。この
パラメータ。したがって、このポインタはオブジェクトに格納されません。
4このポインターは、陰関数ポインターパラメーターの最初のメンバーであり、通常、コンパイラーによってecxレジスターを自動的に通過します。ユーザーは、
渡す必要はありません。