一、this指针介绍
概念:this指针是成员函数的一个隐式参数,在类中本质上就是对象的指针(常量指针)
特点:
在成员函数中可通过this指针区别成员变量与形参变量
this可以显式调用
示例代码:
class Cperson
{
private:
int age;
float height;
public:
void InitPerson(int age,float height);
};
void Cperson::InitPerson(int age,float height)
{
this->age=age;
this->height=height;
}
二、返回*this成员函数
概念:返回值是*this,也就是返回调用此成员函数的对象的自身引用,返回值类型为对象引用类型
class Person
{
private:
int age;
public:
Person& setAge(int age);//返回自身引用
};
Person& Person::setAge(int age)
{
this->age=age;
return *this;//返回*this(自身引用)
}
从const成员函数返回*this:如果一个const成员函数返回*this,那么此函数的返回值类型是常量引用:比如上面的代码中的setAge函数变为常量成员函数
const Person& setAge(int age)const;
三、this指针剖析
this指针剖析
对于类成员函数而言,并不是一个对象对应一个单独的成员函数体,而是此类的所有对象共用这个成员函数体。当程序被编译之后,此成员函数地址已经确定
我们常说,调用类的成员函数时,会将当前对象的this指针传递给成员函数:
上面我们说了,一个类的成员函数只定义了一份,所有对象共用这个成员函数体
那么如何区分哪个对象调用此函数呢?这就是this指针的作用,每次对象调用成员函数时,将this指针(对象首地址)传递给成员函数,然后在函数体内对类的数据成员访问时,就会被转换为“this->数据成员”的形式
如果成员函数内部没有访问对象的任何数据成员,那么传进来的this指针实际没有任何用处,这样的函数与全局函数并没有太大区别
演示案例
#include
using namespace std;
class MyClass
{
public:
int data;
MyClass(int data)
{
this->data = data;
}
void print()
{
//cout<< data << endl;
cout << "hello!" << endl;
}
};
int main()
{
MyClass *pMyClass;
pMyClass = new MyClass(1);
pMyClass->print();
pMyClass[0].print();
pMyClass[1].print();
pMyClass[10000000].print();
return 0;
}
运行效果如下所示:
结果分析:
此处我们创建了一个对象,但是访问后面越界之后仍然可以访问成功
上面我们说过了,如果一个成员函数没有操作任何类的数据成员,因此这个成员函数与全局函数类型,调用之后都会打印“hello!”
但是如果把14行的代码取消注释会怎么样呢?见下面演示案例
代码改进
#include
using namespace std;
class MyClass
{
public:
int data;
MyClass(int data)
{
this->data = data;
}
void print()
{
//cout<< data << endl;
cout << "hello!" << endl;
}
};
int main()
{
MyClass *pMyClass;
pMyClass = new MyClass(1);
pMyClass->print();
pMyClass[0].print();
pMyClass[1].print();
pMyClass[10000000].print();
return 0;
}
运行效果如下所示:
结果分析:
此处我们的成员函数访问了类的数据成员,那么每次打印数据时都会通过this指针调用
但是此处我们只创建了一个对象,所以当调用pMyClass[1]和pMyClass[10000000]越界了,找不到对象,从而报错