您的位置:首页 > 编程语言 > C语言/C++

this指针 C++

2016-03-29 09:51 267 查看
首选总结一下this指针的作用,然后再详细介绍:

1、由于this并不是一个常规变量,所以,不能取得this的地址;

2、不能给this 指针赋值;

3、this指针最大的作用就是它保存了当前对象的地址,并且应用指针的形式指向了当前的对象(指向正在被该成员函数操作的那个对象)。

 
类和类对象:类是把函数和一些成员数据放在一起,类似于结构体struct。

声明格式是 class+类名 { 数据成员 +成员函数 }
;class 是必须的关键词。

对象就是把 “类” 实例化 ,也类似于结构体变量的声明,它的创建格式是 类名+对象名,比如有一个已经定义的类 A ,可以这样把A实例化 A a ; a就是你创建的对象。只有创建了对象,类才能发挥作用。

1、this指针是一个隐含于每一个成员函数中的特殊指针。它指向正在被该成员函数操作的那个对象。

2. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针。
3. 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。 
4. 在C++中,this指针被隐含地声明为: X *const this,这意味着不能给this 指针赋值;
   在X类的const成员函数中,this指针的类型为:const X* const, 这说明this指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作); 
5. 由于this并不是一个常规变量,所以,不能取得this的地址。
6. 在以下场景中,经常需要显式引用this指针
   (1) 为实现对象的链式引用; 
   (2) 为避免对同一对象进行赋值操作;
   (3) 在实现一些数据结构时,如list。

 

当我们调用一个类对象时,就会有一个this指针与调用成员函数的对象绑定在一起。成员函数可以显式地使用这个指针。

当我们需要使用这个类的整体而不是其中的某个成员时,就需要this指针了。

1、this指针的用处:

一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。例如,调用date.SetMonth(9)
<===> SetMonth(&date, 9),this帮助完成了这一转换 。

2、this指针的使用:

一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n
= n (不能写成n = n,参数n在右边)。

3. this指针程序示例:

this指针存在于类的成员函数中,指向被调用函数所在的类实例(类对象)的地址。 

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
class Point
{
int x, y;
public:
Point(int a, int b) { x = a; y = b; }
void MovePoint(int a, int b){ x += a; y += b; }
void print(){ cout << "x=" << x << "y=" << y << endl; }
};
void main() {
Point point1(10, 10);
point1.MovePoint(2, 2);
point1.print();
}
当对象point1调用MovePoint(2,2)函数时,即将point1对象的地址传递给了this指针。   
MovePoint函数的原型应该是 void MovePoint( Point *this, int a, int b);第一个参数是指向该类对象的一个指针,我们在定义成员函数时没看见是因为这个参数在类中是隐含的。这样point1的地址传递给了this,所以在MovePoint函数中便显式的写成:   

void MovePoint(int a, int b) { this->x +=a; this-> y+= b;} 

即可以知道,point1调用该函数后,也就是point1的数据成员被调用并更新了值。即该函数过程可写成 point1.x+= a; point1. y + = b;

  一个学生可以有多本书一样,而这些书都是属于这个同学的;同理,如果有很多个同学在一起,那么为了确定他们的书不要拿混淆了,最好的办法我想应该就是每个同学都在自己的书上写上名字,这样肯定就不会拿错了。

      同理,一个对象的多个成员就可看作是这个对象所拥有的书;而在很多个对象中间,我们为了证明某个成员是自己的成员,而不是其他对象的成员,我们同样需要给这些成员取上名字。在C++中,我们利用this指针帮助对象做到这一点,this指针记录每个对象的内存地址,然后通过运算符->访问该对象的成员。 

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

class A
{
public:
int get() const{ return i; }
void set(int x){ this->i = x; cout << "this指针保存的内存地址为:" << this << endl;}
private:
int i;
};

int main()
{
A a; //类A的对象a
a.set(9);//此时对象a的值被赋值为9
cout << "对象a所在的内存地址为:" << &a << endl;
cout << "对象a所保存的值为:" << a.get() << endl;
A b;//类A的对象b
b.set(999);//此时对象b的值被赋值为999
cout << "对象b所在的内存地址为:" << &b << endl;
cout << "对象b所保存的值为:" << b.get() << endl;
return 0;
}




通过这个输出结果,我们可以看到,对象a的内存地址和this指针的一模一样;而当运行到对象b的时候,它的内存地址又和它所对应的this指针指向的内存地址一模一样了。这就说明了this指针变量记录的是当前对象的内存地址,即this指针指向当前的对象!

      在程序的第8行,我们就用了this指针的这个属性,即:this->i=x;这句话就表示把x的值赋值给当前对象的私有成员函数i。

      通过上面这个例子,我们可以看到this指针最大的作用就是它保存了当前对象的地址,并且应用指针的形式指向了当前的对象。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++