

C++ 中的 this 和 Python 中的 self
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++
中的 this
和 python
中的 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
不是。 - 两者有相同点,在类的函数内部可以显式的使用它,来调用类内的变量和函数。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK