“该”指针如何巧合指向不同的对象?

| 假设我有一堂课:
class test {
public:
   void print();
private:
   int x;
};

void test::print()  
{  
    cout<< this->x;  
}
我有这些变量定义:
test object1;
test object2;
当我呼叫
object1.print()
时,
this
碰巧存储了
object1
的地址,所以我从
object1
打印中得到了
x
,当我呼叫
object2.print()
时,
this
碰巧存储了地址
object2
,而我从
object2
得到了get5ѭ。它是怎么发生的?     
已邀请:
每个非静态成员函数都有一个隐式的隐藏“当前对象”参数,作为“ 3”指针向您公开。 所以你可以认为
test::print();
有一些
test_print( test* this );
全局函数,所以当你写
objectX.print();
在您的代码中,编译器将插入对
test_print(&objectX);
这样,成员函数就可以知道“当前”对象的地址。     
您可以认为“ 3”指针是函数的隐式参数。想象一下像
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 );
现在,实际上发生的是,使用额外的指针参数调用成员函数
increment
multiply
,它们指向在其上调用该函数的对象。该指针在方法内部称为“ 3”。 the3ѭ指针的类型不同,这取决于该方法是否为
const
(如
multiply
)(与(20ѭ一样)。 您也可以自己做类似的事情,请考虑:
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 );
注意,对于
multiply
函数,
this
指针的类型为
C const * const
,因此指针本身为
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
则使对于该类的所有“ 24”方法可变的变量。     
考虑的方式是ѭ3只是指向您当前正在使用的任何对象的内存的指针。因此,如果您选择
obj1.print()
,则
this = &obj1;
。如果您进行
obj2.print()
,则
this = &obj2;
。     
this
对于不同的对象具有不同的值     
类测试的每个实例都获得它自己的成员变量x的副本。由于x对于每个实例都是唯一的,因此该值可以是您想要的任何值。 变量this,是指与其关联的实例。您不必使用变量\'this \'。您可以这样写:
void test::print()
{
   cout << x;
}
    

要回复问题请先登录注册