目次
6、クラスオブジェクトのサイズ(占有されているバイト数)とストレージメソッド
1つは、クラスの紹介です
1.クラスの紹介
- C言語では、あるプロセス指向に焦点を当て、言語プロセス、問題を解決するための手順を分析し、徐々に関数呼び出しを通じて問題を解決します。
- C ++は、あるオブジェクト指向のプログラミング言語。それは、に焦点を当てたオブジェクト。それは別のオブジェクトに一つのことを分割し、オブジェクト間の相互作用によって、それを完了します。
C言語とC ++のプロジェクト編成の比較:
オブジェクト指向プログラミングには、コードの実行効率に利点はありません。その主な目的は、プログラマーがコードを整理および管理し、プログラミングのアイデアをすばやく整理し、プログラミングのアイデアに革新をもたらすことを容易にすることです。
第二に、クラスの定義
class Student{
public:
//成员变量
char *name;
int age;
float score;
public:
//成员函数
void say(){
cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;
}
};
【ノート】
- Classはクラスを定義するためのキーワード、Studentはクラスの名前、中括弧内の内容はクラスの本体です。クラス定義の終了後のセミコロンに注意してください。
- クラス内の要素が呼び出されるメンバークラスのと、データクラスであると呼ばれる属性またはメンバ変数クラスのと、機能クラスでは、呼び出されるメソッドまたはメンバー関数クラス。
一般的に使用される2つのクラス定義メソッド:
①すべての宣言と定義はクラス本体に配置されます。[注]メンバー関数がクラスで定義されている場合、コンパイラはそれをインライン関数として扱う場合があります
②宣言はヘッダーファイル.hに配置され、クラス定義は.cppファイルに配置されます(推奨メソッド②)
3、クラスのアクセス修飾子
C ++は、カプセル化メソッドを実現します。クラスを使用してオブジェクトのプロパティとメソッドを組み合わせ、オブジェクトをより完全にし、アクセス許可を通じて外部ユーザーにインターフェイスを選択的に提供します。
アクセス修飾子:パブリック(パブリック)、保護(保護)、プライベート(プライベート)
[アクセス修飾子の説明]
1)公開された変更メンバーは、クラス外から直接アクセスできます
2)保護されたメンバーとプライベートに変更されたメンバーはクラス外から直接アクセスできません
3)アクセス権の範囲は、アクセス修飾子が表示される位置から次のアクセス修飾子までです。
4)クラスのデフォルトのアクセス許可はprivateであり、structはpublicです(structはC言語と互換性があるため)
[注]アクセス修飾子はコンパイル時にのみ役立ちます。データがメモリにマップされた後は、アクセス修飾子に違いはありません。
第四に、クラスの範囲
クラスの定義は実際には新しいスコープを定義し、クラスのすべてのメンバーはクラスのスコープ内にあります。クラス外のメンバーを定義するには、次を使用する必要があります。:スコープリゾルバーは、メンバーが属するクラスドメインを示します。
class Student{
private:
//成员变量
char *name;
int age;
float score;
public:
//成员函数
void say();
};
//指定say()属于Student这个类域
void Student::say() {
cout << name << "的年龄是" << age << ",成绩是" << score << endl;
}
5、クラスのインスタンス化
クラスタイプでオブジェクトを作成するプロセスは、クラスのインスタンス化と呼ばれます。
【ノート】
1.クラスは単なるモデルであり、クラス内のメンバーを定義します。クラスを定義しても、それを格納するための実際のメモリスペースは割り当てられません。
2.クラスは複数のオブジェクトをインスタンス化できます。インスタンス化されたオブジェクトは実際の物理空間を占有し、クラスのメンバー変数を格納します。
3.クラスのインスタンス化プロセスは、建築設計図による家の建設と比較できます。クラスは設計図であり、オブジェクトは家です。
6、クラスオブジェクトのサイズ(占有されているバイト数)とストレージメソッド
1.クラスオブジェクトのサイズを計算する方法
#include <iostream>
using namespace std;
//类中什么都没有——空类
class A1 {
};
//类中只有成员函数
class A2 {
public:
void f2();
};
//类中有成员变量和成员函数
class A3 {
private:
int a;
public:
void f2();
};
int main() {
cout << "类A1大小:" << sizeof(A1) << endl;
cout << "类A2大小:" << sizeof(A2) << endl;
cout << "类A3大小:" << sizeof(A3) << endl;
}
演算結果:
結論として:
クラスのサイズは、実際にはクラス内の「メンバー変数」の合計です(メモリアライメントが必要です)。空のクラスのサイズは1バイトで、コンパイラはこのクラスを一意に識別するために空のクラスに1バイトを与えます。
2.クラスオブジェクトのストレージメソッド
各オブジェクトはメンバー変数のみを保存し、メンバー関数は共通のコードセグメントに保存されます。
セブン、このポインター
1.このポインタへの参照
#pragma once
#include <iostream>
using namespace std;
class Student {
public:
//成员变量
string name;
int age;
float score;
public:
//成员函数
void setData(string name, int age, float score) {
this->name = name;
this->age = age;
this->score = score;
}
void say();
};
void Student::say() {
cout << name << "的年龄是" << age << ",成绩是" << score << endl;
}
int main() {
Student stu1,stu2;
stu1.setData("Li hua", 18, 90);
stu2.setData("Li Lin", 19, 50);
stu1.say();
stu2.say();
}
演算結果:
上記のカテゴリに問題があります。
StudentクラスにはsetDataとsayの2つのメンバー関数があります。関数本体の異なるオブジェクトは区別されません。したがって、stu1がsetData関数を呼び出すと、関数は、stu1オブジェクトの代わりにstu1オブジェクトを設定する必要があることをどのように認識しますか。 stu2オブジェクト?
説明:
この問題は、このポインターを導入することでC ++で解決されます。つまり、C ++コンパイラは、各「メンバー関数」に非表示のポインタパラメータを追加して、ポインタが現在のオブジェクト(関数の実行中に関数を呼び出すオブジェクト)と、内のすべてのメンバー変数の操作を指すようにします。関数本体は、ポインタを通過してアクセスします。すべての操作がユーザーに対して透過的であるというだけです。つまり、ユーザーはそれを渡す必要がなく、コンパイラーが自動的に完了します。
2.このポインタの特徴
1)このポインタの型:class type * const
2)メンバー関数内でのみ使用できます
3)このポインタの本質は、メンバー関数の仮パラメータです。オブジェクトがメンバー関数を呼び出すと、オブジェクトアドレスが実際のパラメータとしてこのパラメータに渡されるため、このポインタはオブジェクトに格納されません。
4)このポインターは、メンバー関数の最初の暗黙的なポインターパラメーターです。通常、コンパイラーは自動的にecxレジスターを通過させるため、ユーザーはこれを渡す必要はありません。