5

C++ 中的 this 和 Python 中的 self

 1 year ago
source link: https://muyuuuu.github.io/2022/05/12/Cpp-this-and-python-self/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

C++ 中的 this 和 Python 中的 self

2022-05-122022-05-16

2 947 1 分钟

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

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

class A:
def test(x):
print(x)

# x 接收 12 这个参数
A.test(12)
a = A()
# x 接收 a 这个对象
a.test()
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)

对于 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 不是。
  • 两者有相同点,在类的函数内部可以显式的使用它,来调用类内的变量和函数。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK