C ++の目的このポインタ

このポインターの目的:
1。仮パラメーターとメンバー変数の名前が同じ場合、このポインターを使用して区別できます。
2.クラスの非静的メンバー関数でオブジェクト自体を返すには、return * thisを使用できます。

各非静的メンバー関数は関数インスタンスのみを生成します。つまり、同じタイプの複数のオブジェクトがコードの一部を共有します。問題は、
このコードがどのオブジェクトがそれ自体を呼び出すかをどのように区別するかということです。

C ++は、特別なオブジェクトポインター、このポインターを提供することにより、上記の問題を解決します。
ここに画像の説明を挿入
オブジェクトp1、p2、およびp3はすべてこの関数を呼び出しますが、誰がそれを呼び出したかを区別する方法は?
このポインタを使用して、この問題を解決します

thisポインターは、呼び出されたメンバー関数が属するオブジェクトを指します。
簡単に言えば、この関数を呼び出す人は誰でも、このポインターは誰を指します。

1.このポインターは、すべての非静的メンバー関数を意味するポインターです。
2.このポインタは定義する必要はなく、直接使用できます。

1.名前の競合を解決する:
次に、名前の競合の問題を見てみましょう。

#include <iostream>
using namespace std;

class Person {
    
    
	public:
		Person(int age) {
    
    
			age = age;
		}
		int age;

};


//1.解决名称冲突

void test01() {
    
    
	Person p1(18);
	cout << "p1的年龄为:" << p1.age << endl;

}
//2.返回对象本身用*this

int main() {
    
    
	test01();


	return 0;
}

結果は0です。使用するコンパイラがvsの場合、結果は文字化けするはずです。私はDev-C ++を使用しています。

ここに画像の説明を挿入

コンパイラーは、これら3つの年齢が同じ年齢であると見なしますが、これは属性の年齢と同じではないため、この属性の年齢に値を割り当てたことはありません。

解決策:
1。渡したメンバー属性と仮パラメーター名に同じ名前を付けないでください。
2.このポインタを使用します。

このポインタの使い方は?
コードは次のように表示されます。

#include <iostream>
using namespace std;

class Person {
    
    
	public:
		Person(int age) {
    
    
			//this指针指向的是被调用成员函数所属对象
			this->age = age;
		}
		int age;

};


//1.解决名称冲突

void test01() {
    
    
	Person p1(18);
	cout << "p1的年龄为:" << p1.age << endl;

}
//2.返回对象本身用*this

int main() {
    
    
	test01();


	return 0;
}

ここに画像の説明を挿入
この時点でコンパイラはそう考えているので、問題を解決します。

2. * thisを使用して、オブジェクト自体を返します。
まず、次のコードを見てください

#include <iostream>
using namespace std;

class Person {
    
    
	public:
		Person(int age) {
    
    
			this->age = age;
		}
		int age;

		void PersonADDAge(Person &p) {
    
    
			this->age += p.age;
		}

};


//1.解决名称冲突

//void test01() {
    
    
//	Person p1(18);
//	cout << "p1的年龄为:" << p1.age << endl;
//
//}
//2.返回对象本身用*this

void test02() {
    
    
	Person p1(10);

	Person p2(10);

	p2.PersonADDAge(p1).PersonADDAge(p1).PersonADDAge(p1);

	cout << "p2的年龄为:" << p2.age << endl;

}


int main() {
    
    
//	test01();

	test02();


	return 0;
}

私たちの目標は、p1の年齢をp2に3回追加することです。p2の目的の年齢は40を返しますが、コンパイラはエラーを報告します。なぜですか?

ここに画像の説明を挿入
PersonADDAge関数を初めて呼び出すときは、戻り値が無効であるため、このPersonADDAge関数を呼び出すことはできません。この関数の最初の呼び出しの戻り値をp2のままにできる場合は、もう一度呼び出すことができます。この関数を実装しますか?
このポインタを使用します。

コードは次のように表示されます。

#include <iostream>
using namespace std;

class Person {
    
    
	public:
		Person(int age) {
    
    
			this->age = age;
		}
		int age;
		//如果要返回本体,要用引用的方式返回。
		Person &PersonADDAge(Person &p) {
    
    
			this->age += p.age;
			//this指向p2的指针,而*this指向的就是p2这个对象本体。
			return *this;
		}

};


//1.解决名称冲突

//void test01() {
    
    
//	Person p1(18);
//	cout << "p1的年龄为:" << p1.age << endl;
//
//}
//2.返回对象本身用*this

void test02() {
    
    
	Person p1(10);

	Person p2(10);
	
	//链式编程思想
	p2.PersonADDAge(p1).PersonADDAge(p1).PersonADDAge(p1);

	cout << "p2的年龄为:" << p2.age << endl;

}


int main() {
    
    
//	test01();

	test02();


	return 0;
}

この時点での結果は40です。
では、なぜ参照を使用するのでしょうか。
参照はそれ自体のメモリを指し、参照なしでコピーされ、コピーは別のメモリを指します。

ここで返されるのは、の前追加されるため、ポインタまたは参照ではありません。したがって、返されるのはp2オントロジーです。*

ここに画像の説明を挿入
このとき、この参照を削除して、結果を確認しますか?
結果は次のとおりです。20

どうして?
ここに画像の説明を挿入

この時点で返されるのはコピーされたデータであるため、返されるたびに新しいオブジェクトが返されます。

したがって、最終的に、最初の呼び出しは実際のp2に影響を与えるため、結果は20になります。

おすすめ

転載: blog.csdn.net/m0_51955470/article/details/113124746