C++クラスの詳細分析(on)

私たちは C 言語で構造を学び、C++ ではクラスと呼ばれる新しい概念を導入しました。クラスは、C 言語の構造のアップグレードされたバージョンとして理解できます。なぜそんなことを言うのですか?構造体では構造体のメンバ変数しか宣言できず、構造体のメンバ変数を操作する関数は構造体の外に作成する必要があります。C++ のクラスはこの欠点をうまく補っており、クラス内にメンバ変数だけでなくメンバ メソッド (メンバ関数) も含めることができます。

クラス定義:

class className
{
// 类体:由成员函数和成员变量组成
};  // 一定要注意后面的分号

class はキーワード、className はクラスの名前です。

クラスにメンバー関数を実装するには 2 つの方法があります。1 つ目は、関数の宣言と定義の両方をクラス内に置く方法です。

このメソッドで作成されたメンバー関数は、デフォルトではインライン関数です。

class Stack
{
public:
	void Init()
	{
		//
	}
	void push()
	{
		//
	}

private:
	int* _a;
	int _top;
	int _capacity;
};

 2 つ目は、クラス宣言が.hファイルに配置され、メンバー関数定義が.cppファイルに配置されることです。注:クラス名はメンバー関数名の前に追加する必要があります::

 

 そういえば、コードに public や private などがあるのはなぜなのか、不思議に思う人もいるでしょう。

ここでは、アクセス修飾子という新しい概念が関係します。

ここには、 public、protected、privateの 3 つのアクセス修飾子があります。

public は、クラス外のメンバー変数やメンバー関数が使用できるパブリックであることを意味します。

プロテクトとプライベートは保護とプライベートの意味で、クラス内のものを壁で守るように、クラス内でのみ使用できます。

では、なぜこのように設計されているのでしょうか?

これは、クラスの主要な機能であるカプセル化を示しています。

カプセル化: データとデータを操作する方法を有機的に結合し、オブジェクトのプロパティと実装の詳細を隠し、インターフェイスのみを外の世界に公開します。
オブジェクトと対話します。

そこで、次の質問をします。

 クラスを作成したので、そのクラスには独自のクラス フィールドがあるのに、クラス フィールドを介してアクセスできないのはなぜですか?

理由: class を使用してクラスを宣言すると、それは描画と同等になり、その中の変数はメモリを占有しません。また、ドメイン内のデータにアクセスする場合、それは実データでなければなりません (メモリを占有する必要があります)。したがって、解決策は次のとおりです。最初にクラス オブジェクトを作成し (図面を家に組み込む)、次にオブジェクトを通じてメンバーにアクセスします (建てられた家で作業します)。

int main()
{
	Stack s1;
	s1._top = 10;
	return 0;
}

クラスサイズの計算:

クラスのサイズを計算してください。

class A {
public:
void PrintA()
{
   cout<<_a<<endl; }
private:
char _a;
};

答えを明らかにしましょう:

 答えは 1 です。クラス内の関数が領域を占有していないことは間違いありません。メンバー変数が占有するメモリ サイズは、これまでに学習した構造と同様にメモリ アライメントによって計算されます。クラス内の関数はパブリック コード セグメントに配置され、関数が呼び出されるときはパブリック コード領域に配置されるため、スペースを節約できます。

空のクラスに遭遇した場合、そのサイズは 0 ではなく 1 であることを覚えておいてください。

このポインタ:

これで、関数が共通コード領域に格納されることがわかりました。クラスを使用して 2 つの異なるオブジェクトを作成する場合、それらのメンバー変数は異なりますが、呼び出される関数は同じです。では、このパブリック関数は異なるクラスのデータをどのように区別するのでしょうか? ? ここで、このポインターと呼ばれる新しい概念について触れたいと思います。

 this ポインタは隠しパラメータです。オブジェクトを使用して関数を呼び出すとき、実際にはオブジェクトのアドレスを this ポインターに渡し、シン ポインターはアドレスを通じてオブジェクト内のデータを見つけます。

d1.Print();  //Print(&d1)
d2.Print();  //Print(&d2)

this ポインタは仮パラメータであるため、スタック領域に格納されますが、this ポインタは空であってもよいことに注意してください。

授業に関する最初の記事はこれで終わりです。皆さんのサポートを願っています。カンカンは時間を見つけて急いで授業に関する次の記事を更新します。

おすすめ

転載: blog.csdn.net/m0_69005269/article/details/127137086