Fork me on GitHub

this指针那些事

this指针那些事

引言

​ 对于Python来说有self,类比到C++中就是this指针

用处

  1. 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。
  2. this的作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员时,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说即使你没有写上this指针,编译器也会自动加上this,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。

使用

  1. 在类的非静态成员函数中访问类对象本身的时候,直接使用return *this
  2. 参数与成员变量名相同时,如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 *constA 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* constconst指针,指向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)

posted @ 2020-06-28 01:51  Rser_ljw  阅读(131)  评论(0编辑  收藏  举报