c++ - 'this' 是局部变量吗?

标签 c++ this this-pointer

这里我以重载自增运算符为例:

 class Digit
 {
     int m_digit;

  public:
      Digit (int value)   //constructor
          {
            m_digit = value;
          }

      Digit& operator++();

      int ret_dig (){return m_digit;}
};

Digit& Digit::operator++()
{
   if (m_digit == 9)
        m_digit = 0;

   else  ++m_digit;
    return *this;
 }

int main ()
{
   Digit my_dig (5);
   ++my_dig;
 return 0;
 }

有人告诉我不能返回局部变量。 “this”不是局部变量吗?这是我的想法:

Digit 类型的指针附加到成员函数(重载运算符函数)。当编译器看到行++my_dig 时,它是 Digit 类的实例,它调用成员函数。实例 my_dig 的地址作为参数传递给函数,并且有一个隐藏的名为“this”的“const Digit*”来捕获参数。 “this”被取消引用(隐式地)以访问 m_digit,它是类 Digit 的成员变量。所有增量或包装都在函数内部完成,然后将对取消引用的“this”的引用返回给调用者。是的,这就是我的困惑所在。如果“this”是一个 const Digit* 类型的局部变量,返回时它不应该包含垃圾,因为“this”超出了 block 结束的范围吗?

最佳答案

this 是指向对象本身的所有成员函数的隐式参数——它的生命周期比方法长。参数本身是局部变量,但它指向的对象存在于方法之外。

在这种情况下,对象是在 main 函数的第一行创建的,然后一直存在到 main 方法退出。因此,对象在 operator++ 的整个调用过程中都是安全的!

关于c++ - 'this' 是局部变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32470990/

相关文章:

c++ - 如何在 multimap 的字符串中查找子字符串

c++ - 如何在不重载 `std::multiset` 、 `operator()` 、 `std::less` 的情况下为 `std::greater` 提供自定义比较器?

c++ - 如何优雅地切割物体

javascript - Jquery - 无法使用 $(this) 定位正确的元素

c++ - 避免 local() 调用 tbb enumerable_thread_specific 变量

jQuery:在函数内部使用 $(this) ?

c - 在此范围内未声明错误

javascript - 为什么我不能在箭头函数中访问 `this`?

c++ - 从自身内部替换 std::function(通过 move 赋值到 *this?)