900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > this指针_C++:07this指针

this指针_C++:07this指针

时间:2023-06-15 21:32:14

相关推荐

this指针_C++:07this指针

一、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]越界了,找不到对象,从而报错

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。