01 C程序到c程序的翻译
要理解c上的this指针,请首先将以下c代码转换为c代码
类角色
{
公共:
int m_price; //成员变量
语音(intp ) /成员函数
{
m_price=p;
}
(;
int main () )
{
Car car;
car.setprice(20000; //car对象为m_price成员变量赋值
返回0;
}
c语言是没有类定义的class关键字,但有与class类似的定义。 那是结构体struct。
因为m_price变量是Car类的成员变量,所以可以将Car类和成员变量翻译为c代码,例如:
//结构体Car
结构汽车
{
//price变量是属于Car结构体这一域的变量
int price;
(;
SetPrice函数是Car类的成员函数,但c程序没有成员函数的概念,因此只能将成员函数翻译成全局函数:
//参数1 :结构Car指针
//参数2 :要设定的价格变量
语音设置(结构car * this,int p ) )。
{
this-price=p; //为传递的Car结构的price变量赋值
}
为什么要添加this的指针? 我们继续往下看。
现在,将上面main函数下的c程序翻译为c程序如下:
int main () )
{
结构Car;
setprice(car,20000 );
返回0;
}
因此,最终将上述c程序转换为c程序的代码如下:
结构汽车
{
int price;
(;
语音设置(结构car * this,int p ) )。
{
this-price=p;
}
int main () )
{
结构Car;
setprice(car,20000 ); 为//car结构的price变量赋值
返回0;
}
02 this指针的作用
其作用是指成员函数所作用的对象,
因此,对于非静态成员函数,可以直接使用this来表示指向该函数工作所在的对象的指针。
#包含
类角色
{
公共:
int m_price;
void打印价格(
{
STD :3360 coutm _ prices TD 33603360 endl;
}
是语音设置(intp )
{
this-m_price=p; 等效于m_price=p
this-PrintPrice (; 等效于打印价格
}
Car GetCar () )
{
返回* This; //返回该函数所作用的对象
}
(;
输入主(语音) )。
{
Car car1、car2;
car1.setprice(20000;
//GetCar ) )成员函数返回其所作用的car1对象,并将返回的car1指派给car2
car2=car1.GetCar (;
car2.打印price (;
返回0;
}
输出结果:
20000
20000
在下面的代码中,你认为输出结果是什么? 会发生错误吗?
类a
{
int i;
公共:
void Hello () { cout 'hello' endl; }
(;
int main () )
{
A * p=NULL;
p-Hello (; //结果会怎么样?
}
答案是正常输出hello。 您可能很好奇p指针为空,程序是否不会崩溃。 请不要着急。 如果先把上面的代码转换成c程序,就能理解为什么会正常工作。
void Hello () { cout 'hello' endl; }
#成员函数相当于以下格式:
voidhello(a*this ) { cout 'hello' endl; }
p-Hello (;
Hello )格式执行如下:
光晕(p );
因此,实际上每个成员函数的第一个参数默认具有指向对象的this指针。 在上述情况下,如果对象为空,且成员函数的第一个参数为NULL,则如果成员函数未用于成员变量,则会成功执行。
执行以下代码时,它会走向崩溃。 程序将崩溃,因为this指针为空,空指针指向成员变量I。
类a
{
int i;
公共:
void Hello () { cout i 'hello' endl; }
//-voidhello(a*this ) { cout this-i 'hello' endl; }
(;
int main () )
{
A * p=NULL;
p-Hello (; //-Hello(P );
}
03 this指针和静态成员函数
不能使用this指针,因为静态成员函数相当于不属于对象的共享变量。
04总结
通过将c程序翻译为c程序,了解this指针。 其作用是指非静态成员函数所作用的对象,每个成员函数的第一个参数实际上具有默认的this指针参数。
静态成员函数不能使用this指针。