为什么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
引用函数范围中声明的i
,this->i
引用成员。
为什么不禁止它?
语言很复杂。禁止这样做将需要另外一条规则,而收效甚微。
有什么好处?
在您的示例中,您可以重命名变量之一,但是请考虑宏。可以并且应该完全避免使用宏,但是它们确实存在并且已被使用。例如
#define foofoo { int i=0; std::cout << i; }
void bar() {
int i = 42;
foofoo
std::cout << i;
}
这是一个愚蠢的示例,假设您没有编写宏,并且您不知道它声明了i
。假设禁止在不同作用域中使用相同的名称声明两个不同的变量,即使您没有做错任何事情(当然不是使用宏),此代码也将无效。
编译器可以提供警告,但是将这样的代码变成错误会无缘无故地破坏很多现有代码。
以上是关于为什么C ++允许类成员函数中的局部变量与成员变量同名?的主要内容,如果未能解决你的问题,请参考以下文章
Java基础 -- 静态方法和实例方法有何不同无参构造函数有什么作用import java和javax有什么区别成员变量与局部变量的区别有哪些(成员变量有默认赋值)