一、c++中为何要有this
1、先来看一个例子 - #include "stdafx.h"
- #include <iostream>
- using namespace std;
- class Student{
- private:
- char *m_name;
- int m_age;
- float m_score;
- public:
- void setage(int m_age);
- //声明构造函数
- Student(char *name, int age, float score);
- //声明普通成员函数
- void show();
- };
- //定义构造函数
- Student::Student(char *name, int age, float score){
- m_name = name;
- m_age = age;
- m_score = score;
- }
- void Student::setage(int m_age){
- m_age = m_age;
- }
- //定义普通成员函数
- void Student::show(){
- cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
- }
- int main(){
- //创建对象时向构造函数传参
- Student stu("李雷", 5, 92.5f);
- stu.setage(10);
- stu.show();
- //创建对象时向构造函数传参
- Student *pstu = new Student("韩梅梅", 15, 96);
- pstu->setage(20);
- pstu -> show();
- return 0;
- }
复制代码
- 输出结果是李雷的年龄是5,成绩是92.5;韩梅梅的年龄是15,成绩是96。可能有些读者感到疑惑,年龄为什么不是10,20呢?
- 真正的原因是c++变量的作用域问题,函数形参跟你的变量重名,在函数内部,c++会仍然使用函数形参,也就是现在真正的类变量m_age是没有调用到的!
那怎么样才能调用到类变量呢? 2、再看另一个例子 - #include <iostream>
- using namespace std;
- class Student{
- private:
- char *m_name;
- int m_age;
- float m_score;
- public:
- void setage(int m_age);
- //声明构造函数
- Student(char *name, int age, float score);
- //声明普通成员函数
- void show();
- };
- //定义构造函数
- Student::Student(char *name, int age, float score){
- m_name = name;
- m_age = age;
- m_score = score;
- }
- void Student::setage(int m_age){
- this->m_age = m_age;
- }
- //定义普通成员函数
- void Student::show(){
- cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
- //cout<<this->m_name<<"的年龄是"<<this->m_age<<",成绩是"<<this->m_score<<endl;
- }
- int main(){
- //创建对象时向构造函数传参
- Student stu("李雷", 5, 92.5f);
- stu.setage(10);
- stu.show();
- //创建对象时向构造函数传参
- Student *pstu = new Student("韩梅梅", 15, 96);
- pstu->setage(20);
- pstu -> show();
- return 0;
- }
复制代码
- 输出结果是李雷的年龄是10,成绩是92.5;韩梅梅的年龄是20,成绩是96
- 原来这样,笔者会不会有这样的疑问,我们的类Student ,比如创建了stu,pstu,两个对象均调用函数show,那么我们的类是如何知道,我们是哪个对象调用了这个show函数呢?
- 原来c++在这块,把一个东西隐藏了,对就是所属对象的地址也就是我们的this指针
二、this定义说明
1.定义
2.说明
- this 只能用在类的内部,通过 this 可以访问类的所有成员,包括 private、protected、public 属性的。
- 注意,this 是一个指针,要用->来访问成员变量或成员函数。
3.总结
- this 是 const 指针,它的值是不能被修改的,一切企图修改该指针的操作,如赋值、递增、递减等都是不允许的。
- this 只能在成员函数内部使用,用在其他地方没有意义,也是非法的。
- 只有当对象被创建后 this 才有意义,因此不能在 static 成员函数中使用(后续会讲到 static 成员)
三、this总结
- 只能在“成员函数”中使用
- this指针类型: 类类型 *const (加const是为了保证,指针的指向不被更改)
- this指针不存储在对象中,不影响对象大小,且始终指向当前对象
- this指针是“成员函数”的第一个隐藏参数,由编译器自动给出
|