龙空技术网

C++|非静态成员函数中隐含的this指针参数与编译器行为

小智雅汇 435

前言:

眼前看官们对“c语言addone函数是什么意思”可能比较关怀,同学们都需要剖析一些“c语言addone函数是什么意思”的相关内容。那么小编在网络上网罗了一些关于“c语言addone函数是什么意思””的相关内容,希望大家能喜欢,兄弟们快快来了解一下吧!

C++定义的类中的成员函数除了静态成员函数以外,都隐含了一个this指针参数,这个this指针的类型就是其作用域的类。为简洁起见,既然这些成员函数都需要一个这样的指针,就隐含起来吧(在phthon中是要显式使用指向自身的对象的)。但当编译时,编译器会做类型清除的动作,编译时会添加类类型的this指针,理解了编译器的行为,也就明白了this指针的操作实质。

以下就是一个C++的代码与对应的C代码的小实例:

#if(1) //用带类的C++小实例#include <iostream.h>class CCar{public: 	int price; 	void SetPrice (int p); }; void CCar::SetPrice (int p) { 	price = p; //也可以显示地写出来:this->price = p;} void main(){ 	CCar car; 	car.SetPrice(20000); 	cout<<car.price;}#endif#if(0) //上面C++小实例翻译成对应的C#include <iostream.h>struct CCar{	int price;};void SetPrice(struct CCar* pthis,int p){pthis->price = p; } void main(){ 	struct CCar car; 	SetPrice( &car, 20000);	cout<<car.price;}#endif

非静态成员函数中可以直接使用this来代表指向该函数作用的对象的指针,当需要返回类对象时,就需要显式使用this指针:

#include <iostream>using namespace std;class Complex { public: 	double real, imag; 	void Print() 	{ cout << real << "," << imag ; } 	Complex(double r,double i):real(r),imag(i) { } 	Complex AddOne() { 		this->real ++; //等价于 real ++; 		this->Print(); //等价于 Print 		return * this; } }; int main() { 	Complex c1(1,1),c2(0,0); 	c2 = c1.AddOne(); 	return 0; } //输出 2,1

以下实例可以更深入得理解this指针的实质:

#if(0) //指向类类型的指针调用成员函数(成员函数没有成员变量时)#include <iostream>using namespace std;class A {int i ; public:	void Hello() 	{ 		cout << "hello" << endl; 	} }; void main(){	A * p = NULL; 	p->Hello();//翻译成C代码就是Hello(p),而p在函数体中并未使用,所以并不会出错 system("pause");}//程序输出:hello#endif#if(1)//成员函数有成员变量时,不能用空指针调用成员函数#include <iostream>using namespace std;class A {	int i; public: 	void Hello() 	{ 		cout <<i<< "hello" << endl; 	} }; void main(){	//A * p = NULL; //如果成员函数中引用了成员数据,则不能用指针来直接调用了,需一个实际的对象	A a;	a.Hello(); system("pause");}#endif

操作符重载可以是成员函数或非成员的友元。当重载为成员函数时,因为有一个隐含的this对象指针,所以二元的操作符只需要一个参数即可,一元的操作符不需要参数。当重载为友元时,因为没有隐含的this对象指针,二元的操作符需要两个参数,一元的一个参数。如有一个Sample类,要重载运算符+,重载成成员函数和非成员函数的声明:

Sample operator+(Sample &s);friend Sample operator+( Sample &s1, Sample &s2);

需要注意的是,静态成员函数中不能使用 this 指针! 因为静态成员函数并不具体作用与某个对象! 因此,静态成员函数的真实的参数的个数,就是程序中写出的参数个数!

-End-

标签: #c语言addone函数是什么意思