浅析this指针

来源:互联网 发布:矩阵相加 编辑:程序博客网 时间:2024/05/29 10:15
要说this指针,那我们先来引出this指针,为什么会有this指针?this指针到底是做什么的?
我们先来看个例子:
class Screen {   public:             // 成员函数   private:             string _screen;             mutable string::size_type _cursor; // mutable 成员             short _height;                          short _width;};


Screen类有_screen, _height, _width 和_cursor 数据成员,那么我们将它实例化。


int main() {            Screen myScreen( 3, 3 ), bufScreen;            myScreen.clear();            myScreen.move( 2, 2 );            myScreen.set( '*' );            myScreen.display();            bufScreen.reSize( 5, 5 );            bufScreen.display();}
void Screen::move( int r, int c ){               if ( checkRange( r, c ) ) // 无效位置?              {                 int row = (r-1) * _width; // 行位置                 _cursor = row + c - 1;              }}


我们实例化出两个对象,myScreen以及 bufScreen。

如果调用myScreen实例化对象的函数move(),那么我们可以用到myScreen中的对象成员,

如果调用bufScreen对象的函数move(),我们可以用到bufScreen的对象成员。

那么move中的成员_cursor怎样被依次绑定到属于 myScreen 和bufScreen 的数据成员上呢?

这时 我们就需要this指针


每个类成员函数都含有一个指向被调用对象的指针 这个指针被称为this

在非const成员函数中 它的类型是指向该类类型的指针 

在const 成员函数中是指向const类类型的指针

而在volatile成员函数中 是指向volatile类类型的指针 

例如 在类Screen的成员函数 move()中this指针的类型是Screen* 

在类List的非const成员函数中 this指针的类型是List*


那么了解了this指针,那么到底this指针怎么使用的呢?
用上面的代码举一个例子
void Screen::move( int r, int c ){       if ( checkRange( r, c ) ) // 无效位置?    {         int row = (r-1) * _width; // 行位置         _cursor = row + c - 1;    }}

那么其实C++在处理的时候会将它变成一下代码:

void Screen::move(Screen* this, int r, int c ){      if ( checkRange( r, c ) ) // 无效位置?   {        int row = (r-1) * _width; // 行位置        this->_cursor = row + c - 1;   }}


那么其实就是在move函数形参列表中多了一个this指针。那么调用的时候,其实使用这种方式调用的。
a.move(&a);
那么其实就是将a的地址传给this,然后按照this的指向再去引用其他成员。


那么说完了this指针 我们来简单总结一下this指针的特性
1. this指针的类型是 类类型*const
2. this指针并不是对象本身的一部分,它不影响sizeof的结果。
3. this的作用域在类成员函数的内部。
4. this指针是类成员函数的第一个默认隐含参数,编译器会自动传递。


那么为什么他叫this指针 而不叫引用呢?
我深入调查了一下发现 当有this指针的时候 c++还没有引用机制 所以this指针这一叫法也就沿用至今了

最后 在笔者查询资料的时候 发现了几个写的比较好问题  特此截图分享给大家

 
 

1 0
原创粉丝点击