C++中的this指针与python中的self
先要理解class的意思。class应该理解为⼀种类型,象int,char⼀样,是⽤户⾃定义的类型。⽤这个类型可以来声明⼀个变量,⽐如int x, myclass my等等。这样就像变量x具有int类型⼀样,变量my具有myclass类型。理解了这个,就好解释this了,my⾥的this 就是指向my 的指针。如果还有⼀个变量myclass mz,mz的this就是指向mz的指针。 这样就很容易理解this 的类型应该是myclass *,⽽对其的解引⽤*this就应该是⼀个myclass类型的变量。
通常在class定义时要⽤到类型变量⾃⾝时,因为这时候还不知道变量名(为了通⽤也不可能固定实际的变量名),就⽤this这样的指针来使⽤变量⾃⾝。
1. this指针的⽤处:
⼀个对象的this指针并不是对象本⾝的⼀部分,不会影响sizeof(对象)的结果。
this作⽤域是在类内部,当在类的⾮静态成员函数中访问类的⾮静态成员的时候,编译器会⾃动将对象本⾝的地址作为⼀个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为⾮静态成员函数的隐含形参,对各成员的访问均通过this进⾏。例如,调⽤date.SetMonth(9) <===> SetMonth(&date, 9),this帮助完成了这⼀转换 .
在成员函数内部,我们可以直接使⽤调⽤该函数的对象的成员,⽽⽆需通过成员访问运算符来做到这⼀点,因为this所指的正是这个对象。任何对类成员的直接访问都被看成this的隐式使⽤。
this的⽬的总是指向这个对象,所以this是⼀个常量指针,我们不允许改变this中保存的地址
2. this指针的使⽤:
⼀种情况就是,在类的⾮静态成员函数中返回类对象本⾝的时候,直接使⽤ return *this;另外⼀种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。
3. this指针程序⽰例:
this指针是存在与类的成员函数中,指向被调⽤函数所在的类实例的地址。
根据以下程序来说明this指针
#include<iostream.h>
class Point
{
int x, y;
public:
Point(int a, int b) { x=a; y=b;}
Void MovePoint( int a, int b){ x+=a; y+=b;}
Void print(){ cout<<"x="<<x<<"y="<<y<<endl;}
};
void main( )
{
Point point1( 10,10);
point1.MovePoint(2,2);
point1.print( );
}
当对象point1调⽤MovePoint(2,2)函数时,即将point1对象的地址传递给了this指针。
MovePoint函数的原型应该是 void MovePoint( Point *this, int a, int b);第⼀个参数是指向该类对象的⼀个指针,我们在定义成员函数时没看见是因为这个参数在类中是隐含的。这样point1的地址传递给了this,所以在MovePoint函数中便显式的写成:
void MovePoint(int a, int b) { this->x +=a; this-> y+= b;}
即可以知道,point1调⽤该函数后,也就是point1的数据成员被调⽤并更新了值。
即该函数过程可写成 point1.x+= a; point1. y + = b;
4. 关于this指针的⼀个精典回答:
当你进⼊⼀个房⼦后,
你可以看见桌⼦、椅⼦、地板等,
但是房⼦你是看不到全貌了。
对于⼀个类的实例来说,
你可以看到它的成员函数、成员变量,
但是实例本⾝呢?
this是⼀个指针,它时时刻刻指向你这个实例本⾝。
=================this指针的由来====================
⼀个学⽣可以有多本书⼀样,⽽这些书都是属于这个同学的;同理,如果有很多个同学在⼀起,那么为了确定他们的书不要拿混淆了,最好的办法我想应该就是每个同学都在⾃⼰的书上写上名字,这样肯定就不会拿错了。
同理,⼀个对象的多个成员就可看作是这个对象所拥有的书;⽽在很多个对象中间,我们为了证明某个成员是⾃⼰的成员,⽽不是其他对象的成员,我们同样需要给这些成员取上名字。在C++中,我们
利⽤this指针帮助对象做到这⼀点,this指针记录每个对象的内存地址,然后通过运算符->访问该对象的成员。
=================this指针作⽤⽰例====================
⼆话不说!我们通过⼀个程序来体现this指针的实际⽤处:
#include <iostream>
using namespace std;
class A
{
public:
int get() const{return i;}
void set(int x){this->i=x;cout<<"this指针保存的内存地址为:"<<this<<endl;}
private:
关于python的书int i;
};
int main()
{
A a;
a.set(9);
cout<<"对象a所在的内存地址为:"<<&a<<endl;
cout<<"对象a所保存的值为:"<&()<<endl;
cout<<endl;
A b;
b.set(999);
cout<<"对象b所在的内存地址为:"<<&b<<endl;
cout<<"对象b所保存的值为:"<&()<<endl;
return 0;
}
这个程序的输出如下:
通过这个输出结果,我们可以看到,对象a的内存地址和this指针的⼀模⼀样(都是0017F7E8);⽽当运⾏到对象b的时候,它的内存地址⼜和它所对应的this指针指向的内存地址⼀模⼀样了(都是0017F7DC)。
这就说明了this指针变量记录的是当前对象的内存地址,即this 指针指向当前的对象!
在程序的第8⾏,我们就⽤了this指针的这个属性,即:this->i=x;这句话就表⽰把x的值赋值给当前的对象的私有成员函数i。
=================总结====================
通过上⾯这个例⼦,我们可以看到this指针最⼤的作⽤就是它保存了当前对象的地址,并且应⽤指针的形式指向了当前的对象。这种好处我们将会在另外⼀篇博⽂中看到.......
  Python中符合序列的有序序列都⽀持切⽚(slice),例如列表,字符串,元组。
格式:【start:end:step】
start:起始索引,从0开始,-1表⽰结束
end:结束索引
step:步长,end-start,步长为正时,从左向右取值。步长为负时,反向取值
注意切⽚的结果不包含结束索引,即不包含最后的⼀位,-1代表列表的最后⼀个位置索引
a=[1,2,3,4,5,6]
b1=a[:] #省略全部,代表截取全部内容,可以⽤来将⼀个列表拷给另⼀个列表
print(b1)
结果:[1, 2, 3, 4, 5, 6]
b=a[0:-1:1] #从位置0开始到结束,每次增加1,截取。不包含结束索引位置
print(b)
结果:[1, 2, 3, 4, 5]
c1=a[:3] #省略起始位置的索引,以及步长。默认起始位置从头开始,默认步长为1,结束位置索引为3
print(c1)
结果:[1, 2, 3]
c=a[0:5:3] #从第⼀个位置到第留给位置,每3个取⼀个值
print(c)
结果:[1, 4]
d=a[5:0:-1] #反向取值print(d)
结果:[6, 5, 4, 3, 2]
d1=a[::-1]
print(d1)
结果:[6, 5, 4, 3, 2, 1]

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。