1つ、oopオブジェクト指向
cでは、関数のさまざまな定義があります。しかし、C ++では、私たちはエンティティの抽象的なタイプです。次の図は、それらのoopアイデア間の関係を示しています。
oop言語の4つの特性:抽象カプセル化(非表示)継承多態性
第二に、クラスとオブジェクト
クラスとオブジェクトを指定するために商品クラスを記述しましょう
最初に、C言語の構造体に相当する商品クラスを定義します。
1.クラス定義
const int NAME_LEN = 20;
class CGoods
{
public:
void init(const char* name, double price, int amount);//做商品数据初始化
void show();//打印商品信息
void setName(char* name) { strcpy(_name, name); }
void setPrice(double price) { _price = price ;}
void setAmount(int amount) { _amount = amount ;}
const char* getName() {return _name;}
double getPrice() { return _price ;}
int getAmount() { return _amount; }
private:
char _name[NAME_LEN];
double _price;
int _amount;
};
上記のクラスでは、私たちは理解できます
(1)private:属性(メンバー変数)は一般にプライベートです
(2)public:メンバーメソッドは、プライベートプロパティ**にアクセスするための外部への共通メソッドを提供します。クラスに実装されたメソッドは自動的にインライン関数に処理されます**
(3)setXXXおよびgetXXX:メンバー変数に個別にアクセスするか、メンバー変数の値を取得するようにインターフェイスを設定し、メンバー変数にgetXXXまたはsetXXXメソッドのセットを提供します
(4)クラス:スペースを占有しない商品の抽象的なデータ型CGoodsは無数のオブジェクトを定義できます。各オブジェクトには独自のメンバー変数がありますが、それらはメンバーメソッドのセットを共有します。オブジェクトとメンバー変数のメモリサイズを
渡すことができます。オブジェクトのメモリサイズを表示するには、VSでcmdコマンドのみを使用してください。
2.クラス外の定義
クラス外で定義されたメソッドは、通常の関数であるクラスの関数名の前にスコープを設定する必要があります。インライン関数になりたい場合は、明示的にインラインを追加する必要があります
void CGoods::init(const char* name, double price, int amount)
{
strcpy(_name, name);
_price = price;
_amount = amount;
}
void CGoods::show()
{
cout << "name:" << _name << endl;
cout << "price:" << _price << endl;
cout << "amount:" << _amount << endl;
}
3.メイン関数インスタンス化クラス
int main()
{
CGoods good1;//类实例化了一个对象,对象占用空间,在栈上
good1.init("面包", 10.0, 200);
good1.show();
good1.setPrice(20.5);
good1.setAmount(100);
good1.show();
CGoods good2;
good2.init("空调", 10000.0, 50);
good2.show();
return 0;
}
実行結果は次のとおりです。
三、このポインター
機能:メソッド内のさまざまなオブジェクトを区別するために、
そのような問題について考えてみましょう
(1)init(名前、価格、金額)は、情報を初期化するオブジェクトをどのようにして知るのですか?
good1.init( "bread"、10.0、200);実際には、good1.init(&good1、 "bread"、10.0、200);オブジェクトアドレスが渡されるクラスのオブジェクト
メソッドがコンパイルされ、すべてのメソッドパラメータ、 thisポインターを追加して、メソッドを呼び出すオブジェクトのアドレスを受け取ります
(2)メソッドのセットが複数のオブジェクトを処理できるのはなぜですか?
オブジェクトがメソッドを呼び出すと、オブジェクトのアドレスが実際のパラメーターを介してその関数に渡され、これらの関数はコンパイル時に生成されたtilsポインターを使用して受信オブジェクトのアドレスを受け入れます
以下はこのポインタの呼び出し方法です
void CGoods::init(const char* name, double price, int amount)
{
strcpy(_name, name);
this->_price = price;
this->_amount = amount;
}
void CGoods::show()
{
cout << "name:" << this->_name << endl;
cout << "price:" << this->_price << endl;
cout << "amount:" << this->_amount << endl;
}