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
土木工程