在成员函数中声明的变量与成员变量相同

variable declared in member function is same as member variable

本文关键字:变量 成员 声明 函数      更新时间:2023-10-16

不知道这是否会工作,以及如何:

class sample
{
 int i;
 int func1()
  {
   int i = 0;
   i++;
   return i;
  }
}

我问这个问题是因为我有很多成员函数和坏名字约定。

当您说int i = 0时,您正在创建一个名为i的新变量,该变量隐藏了类成员。如果您想访问类的i,您可以执行this->i。但通常最好一开始就不要引起这种混淆。

func1的体中,您将引用本地声明的int i。为了引用类成员,需要使用this指针显式地引用它:

this->i

this是传递给类中所有方法的const指针,用于表示当前实例。当然,当你有static成员函数时,它不会传入。

首先使用本地声明的int i的原因是因为它与i++return i处于相同的作用域。

作用域变得很奇怪:

int func1()
{
    int i = 0;
    i++;
    { //1
        int i = 41;
        i++;
    }
    { //2
        int j = i + 1;
        cout << j << endl // this prints 2
    }
    return i;
}

在作用域中使用变量的规则是,它总是首先引用最局部的作用域,然后向上处理。因此,在您的示例中,函数中的i将不会引用类中的i

效果很好。在函数内部对i名称的所有使用都引用该函数内部声明的i。也就是说,函数每次都会返回1。

在func1()中使用i的目的是什么?你是想增加外部的i还是函数内部的i。如果你想让外部的i递增,那么这是行不通的

返回值实际上是指在func1()中声明的i。都是关于作用域的

作用域以{开始,以}结束。在一个作用域内声明的所有变量,只有当您留在该作用域内或进入另一个作用域时才会被定义。因此

{ int i = 0; { int i = 1; { int i = 2; }}}

是完全可能的。如果在其中一个作用域中使用i,则将始终引用同一作用域中的i。引用更高作用域的i比较困难。

在你的例子中,你仍然可以通过使用this->i来引用顶部的i,其中this是指向你正在使用的对象的指针。这里有一些更多的信息(向下滚动一点)