3

这里我举一个重载自增运算符的例子:

 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”不是局部变量吗?这是我的想法:

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

4

3 回答 3

5

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

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

于 2015-09-09T04:41:03.200 回答
2

this&my_dig是一个局部变量,但是在进入方法时被初始化。的值与&my_dig具有相同的生命周期my_dig,在主块的末尾结束。因此,虽然this超出范围,但 的值this仍然有效。

于 2015-09-09T04:47:18.633 回答
2

是对象而*this不是局部变量。编译器认为需要分配的任何临时对象,例如完成表达式所需的临时对象,都具有到表达式末尾的生命周期。

这对于具有析构函数的对象来说变得很有趣,因为析构函数不是在表达式的各个部分完成时运行,而是在整个表达式完成时运行——因此您的*this变量将存活足够长的时间来完成所需的内容。

看看这个问题进行更深入的讨论

于 2015-09-09T04:50:30.387 回答