1

假设我有一堂课:

class test {
public:
   void print();
private:
   int x;
};

void test::print()  
{  
    cout<< this->x;  
}

我有这些变量定义:

test object1;
test object2;

当我打电话object1.print() this时碰巧存储地址,object1所以我xobject1打印中获取,当我调用object2.print() this碰巧存储地址时object2,我xobject2印刷中获取。它是如何发生的?

4

5 回答 5

6

每个非静态成员函数都有一个隐式隐藏的“当前对象”参数,它作为this指针公开给您。

所以你可以认为

test::print();

有一些

test_print( test* this );

全局函数等等当你写

objectX.print();

在您的代码中,编译器会插入一个调用

test_print(&objectX);

这样成员函数就知道“当前”对象的地址。

于 2011-04-13T11:08:04.633 回答
2

您可以将this指针视为函数的隐式参数。想象一个像这样的小课

class C {
public:
  C( int x ) : m_x( x ) { }

  void increment( int value ) {
    m_x += value; // same as 'this->m_x += value'
  }

  int multiply( int times ) const {
    return m_x * times; // same as 'return this->m_x * times;'
  }

private:
  int m_x;
};

它允许您编写类似的代码

C two( 2 );
two.increment( 2 );
int result = two.multiply( 3 );

现在,实际发生的是成员函数incrementmultiply使用额外的指针参数调用,指向调用函数的对象。这个指针被称为this方法内部。指针的类型this是不同的,这取决于方法是const(原样multiply)还是不是(与 的情况一样increment)。

你也可以自己做类似的事情,考虑:

class C {
public:
  C( int x ) : m_x( x ) { }

  void increment( C * const that, int value ) {
    that->m_x += value;
  }

  int multiply( C const * const that, int times ) const {
    return that->m_x * times;
  }

private:
  int m_x;
};

你可以写这样的代码

C two( 2 );
two.increment( &two, 2 );
int result = two.multiply( &two, 3 );

请注意,this指针的类型是C const * const针对multiply函数的,因此指针本身也是指向const的对象!这就是为什么您不能更改const方法内的成员变量的原因 -this指针具有禁止它的类型。这可以使用mutable关键字来解决(我不想走得太远,所以我宁愿不解释它是如何工作的),甚至可以使用const_cast

int C::multiply( int times ) const {
  C * const that = const_cast<C * const>( this );
  that->m_x = 0; // evil! Can modify member variable because const'ness was casted away
  // ..
}

我之所以提到这一点,是因为它表明它this并不像看起来那样特殊,而且这种特殊的 hack 通常是比制作成员变量更好的解决方案,mutable因为这种 hack 对于一个函数是本地的,而使变量对所有人都是mutable可变的类的方法。 const

于 2011-04-13T11:11:41.400 回答
1

考虑它的方法是,this它只是指向您当前正在使用的任何对象的内存的指针。所以,如果你这样做obj1.print(),那么this = &obj1;。如果你这样做obj2.print(),那么this = &obj2;

于 2011-04-13T11:03:29.320 回答
1

this对不同的对象有不同的值

于 2011-04-13T11:03:55.660 回答
1

类 test 的每个实例都有它自己的成员变量 x 的副本。由于 x 对于每个实例都是唯一的,因此该值可以是您想要的任何值。变量this,指的是它所关联的实例。您不必使用变量“this”。你可以写:

void test::print()
{
   cout << x;
}
于 2011-04-13T11:05:14.653 回答