0%

C++ 中的 this 和 Python 中的 self

之前一直好奇 C++ 中的 thispython 中的 self 到底是什么关系,为什么 C++ 要显式的写出来,python 则不需要。顺便深入了解一下 this

self

python 当对象调用类中的函数的时候,系统会自动把当前对象传入函数,且参数就是第一个 self,不过可以用其他 token 代替 self。因此在定义的时候,需要声明 self 这个参数,调用时,却不需要手动传入对象。

1
2
3
4
5
6
7
8
9
class A:
def test(x):
print(x)

# x 接收 12 这个参数
A.test(12)
a = A()
# x 接收 a 这个对象
a.test()
1
2
3
4
5
6
7
8
9
class A:
def test(mine, x):
print(x)

# mine 接收 1,x 接收 12
A.test(1, 12)
a = A()
# mine 接收 a,x 接收 12
a.test(12)

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 不是。
  • 两者有相同点,在类的函数内部可以显式的使用它,来调用类内的变量和函数。
感谢上学期间打赏我的朋友们。赛博乞讨:我,秦始皇,打钱。

欢迎订阅我的文章