一、C++中的this指针
先看一段代码
class Student
{
public:
void eat(char* _what)
{
std::cout << mname << " is eatting " << _what << std::endl;
}
void sleep(char* _where)
{
std::cout << mname << " is sleeping at " << _where << std::endl;
}
void play()
{
std::cout << mname << " is palying doudou! " << std::endl;
}
void solve()
{
std::cout << mname << " is doing this math! " << std::endl;
}
private:
char* mid;
char* mname;//模拟姓名
bool msex;//模拟性别
int mage;//模拟年龄
};
int main()
{
Student stu;//Student是类名(类型)自定义类型
return 0;
}
1、这个代码我们简单得设计了一个类。我们现在设计的这三个对象是这样的,如图所示:
我们现在调用eat这个函数,假设stu1、stu2、stu3这三个函数现在都调用eat这个函数。那么应该是这样的:
stu1.eat("肉");
stu2.eat("肉");
stu3.eat("肉");
但是在函数执行的时候我们可以在调用点知道是哪个对象调用了这个函数,但无法在定义点知道是哪个对象调用了这个函数。为了避免这种情况的发生。C语言的处理是这样的:
void eat(Student* pstu, char* _what)
{
std::cout << pstu->mname << " is eadtting " << _what << std::ednl;
}
在调用eat时先传入某一个对象的地址,然后指针指向这个地址来进行操作。
C++是这样操作的,加上this这个关键字
void eat(char* _what)
{
std::cout << this->mname << " is eatting " << _what << std::endl;
}
通过this指针以指向的方式调用里面的成员变量。这和C语言中的pstu->name
的方式是一样的。都是指向一个对象。
类中成员的访问,系统在成员名称之前自动加上this指针,使用this指针后系统会给定一个默认的隐藏参数
当加上this指针后,当执行这句代码时stu1.eat("肉")
,系统会将stu1的地址传递给this指针,所以在调用时this会先指向stu1。
2、与C语言调用的区别
都是传入对象的地址,只不过C语言是认为传递,C++是系统传递
二、this指针的其他属性
this指针不能被修改
extern Student stu;
class Student
{
public:
void eat(char* _what)
{
this = &stu;
std::cout << mname << " is eatting " << _what << std::endl;
}
void sleep(char* _where)
{
std::cout << mname << " is sleeping at " << _where << std::endl;
}
void play()
{
std::cout << mname << " is palying doudou! " << std::endl;
}
void solve()
{
std::cout << mname << " is doing this math! " << std::endl;
}
private:
char* mid;
char* mname;//模拟姓名
bool msex;//模拟性别
int mage;//模拟年龄
};
Student stu;
int main()
{
Student stu1;//Student是类名(类型)自定义类型
stu1.eat("meat")
return 0;
}
这个代码从调用点来看最后调用的结果是:
zhangsan is eatting meat
但是通过分析后
- this指针先是指向了stu1这个对象
- 函数内部中this之中呢发生了变化,this指针不指向stu1了而是指向了stu这个对象
- 这个情况一旦发生就有可能导致程序混乱的情况
它出现错误的原因是this指针不能做左值,就代表this指针不能被修改所以这块我们用const来修饰。
void eat(Student* const this,char* _what)
{
std::cout << mname << " is eatting " << _what << std::endl;
}
所以this指针的原型是类类型的指针:
TYPE* const this;
这就保证了一趟函数调用过程中,this指针指向不发生变化。