目次
クラスメンバー関数およびフレンド関数としての演算子オーバーロード関数
第8章クラスとオブジェクト
オブジェクト指向メソッドの概要
プロセス指向:比較的小規模なプログラムに適しており、実際には、各機能を1つずつ実現することを指向しています。プログラム=アルゴリズム+データ構造
オブジェクト指向:比較的大規模なプログラムに適しており、データと関数によってカプセル化されたオブジェクトを対象としています。プログラム=複数のオブジェクト+メッセージ[オブジェクト=アルゴリズム+データ構造]
オブジェクト:外界の特定のものは、C ++では特定のオブジェクトと見なすことができます。オブジェクトは、データと関数の合成で構成されます。
属性:クラスや教室の生徒数など、オブジェクトの静的特性
動作:クラス会議などのオブジェクトの動的特性。動作はメッセージによって制御されます。
カプセル化: 1つはデータとコードをオブジェクトにカプセル化することであり、もう1つはオブジェクトの一部を外部から隠すことです。
抽象化:クラスはオブジェクトの抽象化、クラスはオブジェクトのテンプレート、オブジェクトはクラスの特殊なケース、またはオブジェクトはクラスの具体的な表現です
継承と再利用:継承とは、前のクラスを使用して一部の関数を拡張し、新しいクラスを生成する機能です。再利用とは、ソフトウェアの再利用です。
ポリモーフィズム:同じメッセージを異なるオブジェクトに送信し、それらはそれぞれポリモーフィズムと呼ばれる異なるアクションを実行します
クラス宣言とオブジェクト定義
クラスは抽象的でメモリを占有しませんが、オブジェクトは特定でメモリを占有します。実際、クラスは広い意味でのデータ構造です。
クラスの宣言メソッドも構造体型から開発されています。C++では、この2つを共通に使用することもできます。違いは、クラスが指定されていない場合はデフォルトでprivateになり、構造体はデフォルトでpublicになります。クラスを使用してクラスを作成するには、privateおよびpublicがメンバーアクセス修飾子です
クラスはデータと操作をカプセル化します。一般的に、クラスはデータを非表示にし、メンバー関数を外部インターフェイスとして使用します。
クラス関数を使用する際の注意事項:呼び出し権限に注意し、関数の範囲(呼び出すことができるデータと関数の範囲)に注意してください。
publicのメンバー関数はクラスの外部インターフェイスであり、privateのメンバー関数はクラス内の他のメンバーのユーティリティ関数であり、クラス外のユーザーは呼び出すことができません。
メンバー関数は、クラスの外部で定義することもできます。次に例を示します。
class Student
{
public:
void display();
private:
int num;
string name;
char sex;
};
void Student::display()
{
cout<<num<<endl;
cout<<name<<endl;
cout<<sex<<endl;
}
Student stu1, stu2;
上記のメンバー関数がどのように定義されているかに注意してください-voidStudent :: display()、ここで2つのコロン::は、この関数が2つのコロンの前のクラスのクラスメンバーに属していることを表します。これらの2つのコロンしかない場合は、または何もない場合、この関数はメンバー関数ではなく、グローバル関数です
オブジェクトが占めるスペースは、オブジェクトのデータメンバーが占めるスペースにのみ関連し、メンバー関数とは関係ありません。つまり、クラスに関数を格納するためのスペースが節約されます。
オブジェクトメンバーへの参照
クラスのメンバーを参照する3つの方法
(1)オブジェクト名。メンバー名
stu.num
(2)ポインタを使用する:
pStu->num //方式一
(*pStu).num //方式二
(3)参照の使用:stu2はstu1のエイリアスであり、どちらも同じメモリを参照します
Student stu1;
Studnet &stu2 = stu1;
C ++の場合、クラスが明確に定義されている限り、プログラムを作成する作業は非常に簡単です。
クラスのカプセル化と情報の隠蔽
クラスの役割は、ユーザーが宣言した抽象データ型にデータとアルゴリズムをカプセル化することです。ユーザーは主に、パブリックメンバー関数を呼び出すことによってクラスによって提供される関数を実装します(データメンバーへの値の割り当て、値の表示など)データメンバーの、およびデータの処理)。待機)
パブリックインターフェイスとプライベート実装の分離:たとえば、ソフトウェア開発の過程で、2つの分離を実現する必要があります。このように、クラスのインターフェイスが変更されない限り、プライベート実装への変更はプログラムの他の部分には影響しません
知識のクラスがプログラムによって使用される場合、クラスの宣言とメンバー関数の定義はプログラムの最初に直接書き込むことができますが、クラスが複数のプログラムによって使用される場合、そのような反復作業の量大きすぎます。一般に、オブジェクト指向開発では、クラス宣言(メンバー関数の宣言を含む)をヘッダーファイルに入れるのが一般的です。ユーザーがこのクラスを使用する場合は、このヘッダーファイルをでラップするだけです。同時に、情報を隠すために、クラスメンバー関数は通常、ヘッダーファイルには配置されませんが、別の照会に配置されます。
クラス宣言とメンバー関数定義の分離の例[合計3つのファイル]:
ファイル1:ヘッダーファイルのクラス宣言:
//文件名:student.h
//这是个类声明头文件
#pragma once
#include <string>
using namespace std;
class Student //类声明
{
public:
void display(); //公用成员函数声明
private:
int num;
string name;
char sex;
};
ファイル2:クラスメンバー関数の定義
//文件名:student.cpp
#include <iostream>
#include "student.h" //注意包含这个类声明头文件
using namespace std;
//在本文件中进行函数的定义
void Student::display() //注意这里的两个冒号很重要
{
cout << num << endl;
cout << name << endl;
cout << sex << endl;
}
ファイル3:主な機能
//文件名:main.cpp
#include <iostream>
#include "student.h" //包含这个类声明头文件
using namespace std;
int main()
{
Student stu; //定义一个对象
stu.display(); //执行对象的display函数,这里你点那个点就会发现其它的成员都访问不了
return 0;
}
誰のためですか?stu
方法は誰ですか?表示()
ニュースは誰ですか?stu.display()
第9章クラスとオブジェクトに関する詳細な説明
コンストラクタ
簡単に言えば、コンストラクターはオブジェクトの初期化を処理することです。クラスは単なるデータ型であり、実際のオブジェクトではないため、クラスの宣言時にクラスのデータメンバーを初期化できないことに注意してください。
コンストラクターの例:
#include <iostream>
using namespace std;
class Time
{
public:
Time() //定义构造成员函数,函数名与类名相同,通过构造函数对对象中的数据成员赋初值
{
hour = 0;
minute = 0;
sec = 0;
}
void set_time();
void show_time();
private:
int hour;
int minute;
int sec;
};
//定义成员函数用于赋值
void Time::set_time()
{
cin >> hour;
cin >> minute;
cin >> sec;
}
//定义成员函数用于输出
void Time::show_time()
{
cout << hour << ':' << minute << ':' << sec;
}
//主函数
int main()
{
Time t; //建立对象t,同时调用构造函数t.Time()进行对象初始化
//t.set_time();
t.show_time();
return 0;
}
さらに、パラメータ初期化テーブルを使用して、データメンバーを初期化できます。
コンストラクターのオーバーロード:クラスに複数のコンストラクターを定義して、クラスオブジェクトに異なる初期化オプションを提供できます。これらのコンストラクターは同じ名前ですが、パラメーターの数またはパラメーターのタイプが異なります。これはコンストラクターのオーバーロードと呼ばれますが、クラスにはデフォルトのコンストラクターは1つだけ
デストラクタ
デストラクタの前に〜記号があります。その機能はコンストラクタの機能とは逆です。デストラクタの機能は、オブジェクトを削除することではなく、オブジェクトがメモリを消費する前にクリーンアップ作業を完了することです。クラスには多くのコンストラクター(オーバーロード)を含めることができますが、デストラクタは1つだけです。スタックと同様に、最初に構築されてから破棄され、後で構築され、最初に破棄されます
オブジェクト配列
配列は、単純な変数だけでなく、オブジェクトで構成することもできます
オブジェクトポインタ
オブジェクトが占めるスペースの最初のアドレスは、オブジェクトのポインターです。
(1)オブジェクト内のデータメンバーへのポインタ
定義方法は構造と同じです
(2)オブジェクト内の関数メンバーへのポインター
通常の関数のポインター変数:void(* p)();ここで、pはvoid型関数を指すポインター変数です。
オブジェクトメンバー関数を指すポインター変数:void(Time :: * p)();ここで、pはTimeクラスのパブリックメンバー関数を指すポインター変数です。
それをどのように定義しますか?例:p =&Time :: get_time;ここでのget_timeは、括弧なしの関数名であることに注意してください。
共有データの保護
データを特定の範囲内で共有できるようにするだけでなく、データが任意に変更されないようにするために、constを使用して関連データを定数として定義できます。
オブジェクトの動的な作成とリリース
オブジェクトを動的に作成および解放する例:[malloc()およびfree()と同様]
Box * pt; //定义一个 Box * 类型的指针变量 pt
pt = new Box; //在 pt 中存放新建的对象的首地址
delete pt; //释放 pt 所指向的内存空间
オブジェクトの割り当てとコピー
コピー=新規+割り当て
静的メンバー
静的データメンバー
各オブジェクトの特定のデータメンバーに一貫性を持たせたい場合は、次のようにクラスで定義できます。
static int height;
静的メンバー関数
静的データメンバーに似ています
static float sum();
友元
友達は公と私の間の何かです。このクラスの外部で定義された関数がある場合(非メンバー関数または他のクラスのメンバー関数である可能性があります)、friendを使用して、クラス本体でこの関数を宣言します。この関数は、このクラスのフレンド関数と呼ばれます。 。このフレンド関数は、このクラスのプライベートメンバーにアクセスできます。
例えば:
#include <iostream>
using namespace std;
class Time
{
public:
Time(int,int,int);
friend void display(Time &); //声明display为Time类的友元函数
private:
int hour;
int minute;
int sec;
};
//定义构造函数用于赋初值
Time::Time(int h,int m,int s)
{
hour = h;
minute = m;
sec = s;
}
//定义成员函数用于输出
void display(Time & t) //t是Time类对象的引用,这个函数是友元函数
{
cout << t.hour << ':' << t.minute << ':' << t.sec;
}
//主函数
int main()
{
Time t(10,13,20);
display(t); //t是Time类对象
return 0;
}
クラステンプレート
クラステンプレートの使用例:
#include <iostream>
using namespace std;
template <class numtype>
class Compare
{
public:
Compare(numtype a, numtype b)
{
x = a;
y = b;
}
numtype max()
{
return(x > y) ? x : y;
}
numtype min()
{
return(x < y) ? x : y;
}
private:
numtype x, y;
};
int main()
{
Compare <int> cmp_1(3, 7);
cout << cmp_1.max() << " is the max of two numbers" << endl;
Compare <float> cmp_2(45.6, 98.7);
cout << cmp_2.min() << " is the min of two numbers" << endl;
return 0;
}
第10章演算子のオーバーロード
演算子のオーバーロードとは
いわゆるオーバーロードは、新しい意味を与えることです。関数のオーバーロードは多目的関数であり、同じ関数名を使用して異なる関数の関数を表すことができます。演算子のオーバーロードは実際には常に使用されます(たとえば、整数や浮動小数点数などの操作を実行するために+を使用します。 。、実際には、これは演算子のオーバーロードです)
いわゆる演算子のオーバーロードは、演算子に新しい意味を与えることです
演算子のオーバーロードの方法とルール
クラスメンバー関数およびフレンド関数としての演算子オーバーロード関数
オーバーロードされた二項演算子
単項演算子のオーバーロード
オーバーロードストリーム挿入演算子とストリーム抽出演算子
異なるタイプのデータ間の変換
型変換機能による型変換