記事のディレクトリ
A、このポインタ
1.1ストレージ・メンバ関数
以下のような整数変数、オブジェクト記憶のために割り当てられたシステムメモリ空間として定義され、オブジェクト・クラス・インスタンスの定義を有します。
各収納スペースにC ++言語は、ストレージスペースを含まないオブジェクトストレージ空間のデータのみメンバーは、機能コードによって占有されているオブジェクトによって占められます。そのデータメンバ、メンバ関数を除くクラスの面で複数のオブジェクトのために、それは同じコードであるため、そのメンバ関数のために、各オブジェクト・コードを保存する必要はありません。これは主にスペースを節約することができます。
オブジェクト指向プログラミングでは、各非静的メンバ関数は、関数呼び出しのオブジェクトへの特殊なポインタに含まれ、このポインタは、このポインタと呼ばれます。
オブジェクトアクセスクラスの非静的メンバ関数は、コンパイラが自動的にこのポインタの最初のパラメータとして暗黙的オブジェクトに取り組むときに、暗黙的に使用される非静的メンバにアクセスするために、非静的メンバ関数にアクセスしますこのポインタ。
この非スタティックメンバ関数の呼び出し終了の破壊後に非静的メンバ関数ポインタを呼び出すとき、このポインタは、非静的メンバ関数の範囲内で、この構造体のポインタです。
注:このインジケータは唯一の非静的メンバに適用される
データメンバとメンバポインタのこの方法では、非静的メンバクラスにアクセスできる必要があります。静的クラスメンバーは、クラス全体に属し、これを言及しないように、特定の主題に属していないオブジェクトへのポインタではありません。この指標は唯一の非静的メンバ関数クラスに現れることができますが、静的メンバ関数のクラスで使用することはできませんので、。
- このポインタの特徴
-
1ポインタのこのタイプは、クラスへのポインタであり、それは変更することができない。
図2は、メンバ関数の内部でのみ使用することができる;
3エッセンスは、メンバ関数のパラメータであるパラメータが格納されていない場合、それは)メンバ関数はsizeof(の大きさに影響を及ぼさないであろう
4本。メンバ関数ポインタは、最初の隠れパラメータへのポインタであります
小さなケース
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
string name;
int num;
int age;
private:
char sex;
public:
char set_sex(char SEX)
{
char sex = SEX;
return sex;
}
public:
void print_name()
{
cout << "name = " << name << endl;
};
};
int main()
{
Student zhang_san, li_si;
zhang_san.name = "zhang_san";
li_si.name = "li_si";
zhang_san.print_name();
li_si.print_name();
return 0;
}
=================运行输出=================
name = zhang_san
name = li_si
明らかに、ジョン・ドウJohn Doeの名前がプリントアウトされた名前をプリントアウトするために、結果は確かに異なっているジョー・スミスジョー・スミスをプリントアウトします。print_nameは、このポインタによって区別されるオブジェクトジョー・スミスやジョン・ドウです。
1.2これを手動で追加します
パラメータ名と同じのメンバ変数の名前は、あなたがこのポインターを追加する必要がある場合。
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
string name;
int num;
int age;
char sex;
public:
void set_sex(char sex)
{
this->sex = sex;
}
};
int main()
{
Student zhang_san, li_si;
zhang_san.name = "zhang_san";
li_si.name = "li_si";
zhang_san.set_sex('F');
li_si.set_sex('M');
cout << "zhang_san.set_sex('F')=>" << zhang_san.sex << endl;
cout << "li_si.set_sex('M')=>" << li_si.sex << endl;
return 0;
}
===========运行输出==============
zhang_san.set_sex('F')=>F
li_si.set_sex('M')=>M