cpp_8 类和对象上(四) --- this遗留

this概念:

  • C++中通过引入this指针解决该问题,
  • 即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

this特性:

  1. this指针的类型:类类型* const
  2. 只能在“成员函数”的内部使用
  3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this 形参。所以对象中不存储this指针。
  4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户 传递
class A
{ 
public:
 	void PrintA() 
 	{
 		cout<<_a<<endl;
	 }
 
	 void Show()
 	{
 		cout<<"Show()"<<endl;
 	}
private:
 	int _a;
};

int main()
{
 	Date* p = NULL;
 	p->PrintA(); 
 	p->Show();
}

问题1:this指针存在哪里?
问题2:this指针可以为空吗?

#if 0
class A
{
public:
	/*
	//this改写:
	void TestFunc(A* const this)
	{
	    this->_t = 10;
		cout << this << endl;
	}
	*/

	void Test()
	{
		cout << "A::Test()" << endl;
	}

	void TestFunc()
	{
		Test();
		cout << this << endl;
	}

	int _t;
};

int main()
{
	A a1,a2,a3;
	//方式一:对象
	a1.TestFunc();    // call A::TestFunc(&a1)
	a2.TestFunc();    // call A::TestFunc(&a2)
	a3.TestFunc();    // call A::TestFunc(&a3)

	//A::TestFunc();  //报错,没有对象无法调用

	// 成员函数必须要通过对象来进行调用,在该成员函数调用之前,
	// 编译器需要将当前对象的地址通过ecx寄存器传递给成员函数
	// 
	//方式二:指针
	A* pa = &a1;
	pa->TestFunc();   // call A::TestFunc(pa);

	pa = &a2;
	pa->TestFunc();   // call A::TestFunc(pa);


	// 注意:pa是A*类型的指针,也就是说pa将来可以指向A类型的对象
	//      如果pa指针没有合法指向时,一般都是将该指针置为nullptr
	//空指针指向this时
	pa = nullptr;
	pa->TestFunc();
	return 0;
}
#endif

方式一:
在这里插入图片描述方式二:
在这里插入图片描述
结论:
在这里插入图片描述

this指针能否为空??

#if 0
class A
{
public:
	/*
	//this改写:
	void TestFunc(A* const this)
	{
	    this->_t = 10;
		cout << this << endl;
	}

	*/

	void TestFunc()
	{
		//this->_t = 10;//访问了成员变量,报错。
		cout << this << endl;
	}

	int _t;
};

int main()
{

	A* pa = &a1;
	pa->TestFunc();   // call A::TestFunc(pa);

	pa = &a2;
	pa->TestFunc();   // call A::TestFunc(pa);

	// 注意:pa是A*类型的指针,也就是说pa将来可以指向A类型的对象
	//      如果pa指针没有合法指向时,一般都是将该指针置为nullptr
	pa = nullptr;
	pa->TestFunc();
	return 0;
}
#endif
#if 0
class A
{
public:
	/*
	//this改写:
	void TestFunc(A* const this)
	{
	    this->_t = 10;
		cout << this << endl;
	}

	*/

	void Test()
	{
		cout << "A::Test()" << endl;
	}

	void TestFunc()
	{
		Test();//没有报错,因为器Test()中也没有成员变量。
		cout << this << endl;
	}

	int _t;
};

int main()
{
	A a1,a2,a3;

	A* pa = &a1;
	pa->TestFunc();   // call A::TestFunc(pa);

	pa = &a2;
	pa->TestFunc();   // call A::TestFunc(pa);


	// 注意:pa是A*类型的指针,也就是说pa将来可以指向A类型的对象
	//      如果pa指针没有合法指向时,一般都是将该指针置为nullptr
	pa = nullptr;
	pa->TestFunc();
	return 0;
}
#endif

结论:
在这里插入图片描述往期链接:
cpp_7.1 类和对象上(三) — this
cpp_7类与对象上(二) — 类对象的存储方式
cpp_6.1类与对象上(一)— 类的引入
cpp_6 nullptr
cpp_5.2 auto关键字
cpp_5.1 内联函数
cpp_5 const修饰的变量和宏
cpp_4 引用
cpp_3 函数重载/传址调用/引用
cpp_2 输入输出/函数/重载
cpp_1 命名空间/输入输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值