之前一直好奇 C++
中的 this
和 python
中的 self
到底是什么关系,为什么 C++
要显式的写出来,python
则不需要。顺便深入了解一下 this
。
self
python
当对象调用类中的函数的时候,系统会自动把当前对象传入函数,且参数就是第一个 self
,不过可以用其他 token
代替 self
。因此在定义的时候,需要声明 self
这个参数,调用时,却不需要手动传入对象。
1 | class A: |
1 | class A: |
this
对于 C++
而言,每个对象都要操作自己内部的数据,如何知道哪里的数据是自己的内部数据,而不会发生调用对象 A
,而修改了对象 B
的数据呢?答案是 this
指针。
this
指针是一个隐含于每一个非静态成员函数中的特殊指针,被隐含地声明为: ClassName \*const this
,也就是地址不能改变,这意味着不能给 this
指针赋值;在类的 const
成员函数中,this
指针的类型为:const ClassName* const
,这说明不能对 this
指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作)。对象被创建以后才会给 this
赋值,并且这个赋值的过程是编译器自动完成的,不需要用户干预,且 this
并不是一个常规变量,而是个右值,所以不能取得 this
的地址。
当对象调用类中的非静态函数时,自动向它传递一个隐含的 this
指针参数,该参数是一个指向这个成员函数所在的对象的指针,在函数体内作为局部变量,且每次成员函数存取数据成员时,都隐式使用 this
指针。
总结一下的话就是:
this
是关键字而self
不是。C++
类内的函数默认都是给对象调用的,而python
不是。python
中的self
还可以用于声明和创建变量,而C++
在类中声明和创建则不需要。- 定义、传参和调用中,
this
参数始终隐藏,而self
不是。 - 两者有相同点,在类的函数内部可以显式的使用它,来调用类内的变量和函数。