this指针

C++ 类的内存分配

如果将类的成员变量和方法分配在一起,则每次实例化一个对象,方法体都要占用一次内存,会产生很大的内存浪费,显然不合理。那么C++的成员变量和方法,内存是如何分配的呢?

成员变量: 所有的成员变量占一块连续的内存(取实例&instance的地址,其实拿到的是这块obj的首地址,这块地址存的是成员变量(知道了数据类型),编译器(pointer+n)很容易拿到各成员的属性值),

方法体:开辟的内存是全局的。 那么调用的时候,会将this指针(Obj* this)隐式地传入方法体当中,所以在C++中每个方法体中都有一个this指针(实例的首地址)

this指针的作用

  • 解决了变量二义性的问题
  • 链式调用,逼格更高

传统

#include <iostream>

class Girl
{
public:
    Girl(std::string name)
    :name(name)
    {

    };
    //设置name
    void setName(std::string name){
        this->name = name;
    };
    //设置age
    void setAge(int age){
        this->age = age;
    };
    //设置nickName
    void setNickName(const char* nickName){
        this->nickName = nickName;
    };
    //设置年级
    void setGrade(const char* grade){
        this->grade= grade;
    };
    //设置学号
    void setNo(int no){
        this->no = no;
    }
    //设置专业
    void setMajor(const char* major){
        this->major = major;
    }
    //得到name
    std::string getName(){
        return this->name;
    }
    //打印个人信息
    void printInof(){
        std::cout<<name<<std::endl;
        std::cout<<nickName<<std::endl;
        std::cout<<age<<std::endl;
        std::cout<<grade<<std::endl;
        std::cout<<no<<std::endl;
        std::cout<<major<<std::endl;
    };

private:
    std::string name;   //姓名
    std::string nickName;  //昵称
    int age;  //年龄
    std::string grade;//年级
    int no; //学号
    std::string major; //主修
};

int main(int argc, const char * argv[]) {
    // insert code here...
    Girl girl("Amy");
    std::cout<<girl.getName()<<std::endl;
    std::cout<<"个人信息:"<<std::endl;
    girl.setName("Lily");
    girl.setNickName("Spider Man");
    girl.setAge(18);
    girl.setGrade("2017级");
    girl.setNo(20170922);
    girl.setMajor("土木工程");
    girl.printInof();
    std::cout << "Hello, World!\n";
    return 0;
}

run

Amy
个人信息:
Lily
Spider Man
18
2017级
20170922
土木工程
Hello, World!

链式调用

#include <iostream>

class Girl
{
public:
    Girl(std::string name)
    :name(name)
    {

    };
    //设置name
    Girl& setName(std::string name){
        this->name = name;
        return *this;
    };
    //设置age
    Girl& setAge(int age){
        this->age = age;
        return *this;
    };
    //设置nickName
    Girl& setNickName(const char* nickName){
        this->nickName = nickName;
        return *this;
    };
    //设置年级
    Girl& setGrade(const char* grade){
        this->grade= grade;
        return *this;
    };
    //设置学号
    Girl& setNo(int no){
        this->no = no;
        return *this;
    }
    //设置专业
    Girl& setMajor(const char* major){
        this->major = major;
        return *this;
    }
    //得到name
    std::string getName(){
        return this->name;
    }
    //打印个人信息
    Girl& printInof(){
        std::cout<<name<<std::endl;
        std::cout<<nickName<<std::endl;
        std::cout<<age<<std::endl;
        std::cout<<grade<<std::endl;
        std::cout<<no<<std::endl;
        std::cout<<major<<std::endl;
        return *this;
    };

private:
    std::string name;   //姓名
    std::string nickName;  //昵称
    int age;  //年龄
    std::string grade;//年级
    int no; //学号
    std::string major; //主修
};

int main(int argc, const char * argv[]) {
    // insert code here...
    Girl girl("Amy");
    std::cout<<girl.getName()<<std::endl;
    std::cout<<"个人信息:"<<std::endl;
    girl
    .setName("Lily")
    .setNickName("Spider Man")
    .setAge(18)
    .setGrade("2017级")
    .setNo(20170922)
    .setMajor("土木工程")
    .printInof();
    return 0;
}

run

Amy
个人信息:
Lily
Spider Man
18
2017级
20170922
土木工程

results matching ""

    No results matching ""