为什么C ++允许类成员函数中的局部变量与成员变量同名?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么C ++允许类成员函数中的局部变量与成员变量同名?相关的知识,希望对你有一定的参考价值。

为什么C ++允许类成员函数中的局部变量与成员变量同名?允许这样做有什么好处?

以下代码编译。

class test
{
public:
  int i = 4;
  void func(){
    int i = 5;

    cout << i << endl;
    cout << this->i << endl;
  }
};

int main(int argc, char const *argv[])
{
  test t;
  t.func(); 
}

输出为

5
4

我认为这里没有任何未定义的行为,因此似乎标准允许这样做。

我只花了一个小时调试代码,却在类成员函数中意外使用了以下代码

auto member_var_name = some_val;         // declared and defined a local variable with the same name as the class member variable

当我打算做的时候

member_var = some_val;

我确实知道构造函数可以使用类成员名称作为参数名称,但是我也不知道类似这样的内容。

答案

我看不到问题。没有歧义。函数范围中的i引用函数范围中声明的ithis->i引用成员。

为什么不禁止它?

语言很复杂。禁止这样做将需要另外一条规则,而收效甚微。

有什么好处?

在您的示例中,您可以重命名变量之一,但是请考虑宏。可以并且应该完全避免使用宏,但是它们确实存在并且已被使用。例如

#define foofoo { int i=0; std::cout << i; }

void bar() {
    int i = 42;
    foofoo
    std::cout << i;
}

这是一个愚蠢的示例,假设您没有编写宏,并且您不知道它声明了i。假设禁止在不同作用域中使用相同的名称声明两个不同的变量,即使您没有做错任何事情(当然不是使用宏),此代码也将无效。

编译器可以提供警告,但是将这样的代码变成错误会无缘无故地破坏很多现有代码。

以上是关于为什么C ++允许类成员函数中的局部变量与成员变量同名?的主要内容,如果未能解决你的问题,请参考以下文章

成员变量与局部变量

C++const成员规则

java类与对象_成员变量和局部变量区别

Java基础 -- 静态方法和实例方法有何不同无参构造函数有什么作用import java和javax有什么区别成员变量与局部变量的区别有哪些(成员变量有默认赋值)

静态成员和非静态成员的区别?

C/C++ union 中的问题