this指针那些事
this指针那些事
引言
对于Python来说有self,类比到C++中就是this指针
用处
- 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。
- this的作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员时,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说即使你没有写上this指针,编译器也会自动加上this,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。
使用
- 在类的非静态成员函数中访问类对象本身的时候,直接使用return *this。
- 当参数与成员变量名相同时,如this->n = n。
PS: 枚举类型
枚举数据类型是一种由程序员定义的数据类型,其合法值是与它们关联的一组命名整数常量。之所以被称为枚举类型,就是因为命名常量是作为数据类型定义的一部分而枚举或列出的。
enum <类型名> {<枚举常量表>};
//关键字enum:说明接下来定义的是一个枚举类型。
//类型名字:指明此处定义的枚举类型的名字。
//常量表:由枚举常量(或称枚举成员)构成。枚举常量表列出枚举类型所有可能的取值,各枚举常量之间用“,”间隔,且各枚举常量必须不同。
//定义枚举类型weekday,可以省略enum的名字(Weekday)
enum Weekday{SUN,MON,TUE,WED,THU,FRI,SAT};
enum Weekday{SUN=7,MON=2,TUE,WED,THU,FRI,SAT}; //赋值
enum color_set1 {RED, BLUE, WHITE, BLACK}; // 定义枚举类型
//枚举类型的使用
enum color_set1 {RED, BLUE, WHITE, BLACK} color1, color2;
color_set1 color1, color2; //写法2
color1=RED; //将枚举常量值赋给枚举变量
另外,在网上大家会看到this会被编译器解析成A *const
,A const *
,究竟是哪一个呢?下面通过断点调试分析:(const指针、指针指向const类)
#include<iostream>
#include<cstring>
using namespace std;
class Person{
public:
typedef enum { //声明枚举类型别名SexType
BOY = 0,
GIRL
}SexType;
Person(char *n, int a,SexType s){
//strlen计算字符串的长度,输入参数是指针,+1是\0
//sizeof计算类型/对象在内存上的存储空间
//new出来的是一段空间的首地址,一般需要用指针来存放这段地址
name=new char[strlen(n)+1];//声明新的空间然后拷贝进来
strcpy(name,n); //n的字符拷贝到前面,返回前者
age=a;
sex=s;
}
int get_age() const{ //const函数
return this->age;
}
Person& add_age(int a){
age+=a;
return *this;
}
~Person(){ //析构函数
delete [] name;
}
private:
char * name;
int age;
SexType sex;
};
int main(){
Person p("zhangsan",20,Person::BOY);
cout<<p.get_age()<<endl;
cout<<p.add_age(10).get_age()<<endl;
return 0;
}
为了验证this指针是哪一个,现在在add_age
处添加断点,运行后会发现编译器自动为我们加上A* const
(const指针,指向A类型的const指针),而不是A const *
(this指向const类型A),因为这里add需要改变数据!
对get_age
添加断点,会发现编译器把上述的this,变为const A* const
。这是因为const函数只能访问const变量与const函数,不能修改其他变量的值,所以需要一个this指向不能修改的变量,那就是const A*
,又由于本身this是const
指针,所以就为const A* const
!
总结
this在成员函数的开始执行前构造,在成员的执行结束后清除。上述的get_age函数会被解析成get_age(const A * const this)
,add_age
函数会被解析成add_age(A* const this,int a)
。