变量的就近原则

就近原则(Principle of Proximity)-把相关的操作放在一起,例如让注释靠近它所描述的代码,让控制循环的代码靠近循环本身等。变量的就近原则指尽可能在靠近第一次使用变量的位置声明和定义该变量。就近原则实际上也是变量的作用域最小化的一种实现手段。过早地声

明局部变量不仅会使它的作用域过早地扩展,而且结束得也过于晚了。局部变量的作用域从它被声明的点开始扩展,一直到外围块的结束处。如果变量在“使用它的块”之外被声明的,当程序退出该块之后,该变量仍是可见的。如果变量在它的目标使用区域之前或之后被意外地使用的话,后果将可能是灾难性的。

public class Test {
    String name="Tom";   //成员变量
    public Test(String name){
        name = name;
    }
    public static void main(String [] args){
        Test t = new Test("Jack");
        System.out.println(t.name);
    }
  }

形参和成员变量重名,根据变量使用的就近原则,会访问到成员变量,所以会输出 Tom

解决方法:通过this引用成员变量,将局部变量赋值给成员变量   所以会输出  Jack

转载于:https://www.cnblogs.com/assistants/p/9524463.html

在C++中,**就近原则**(Name Lookup的最近匹配原则)指的是当编译器查找变量、函数或类型的名称时,会优先从**当前作用域**开始向外层作用域逐层搜索,直到找到匹配的声明。如果多个作用域中存在同名标识符,编译器会选择**最内层作用域**中定义的名称。 ### 核心规则 1. **作用域链搜索顺序**: 从当前代码块(如函数、循环、条件语句)开始,向外搜索(块作用域 → 函数作用域 → 类作用域 → 命名空间作用域 → 全局作用域)。 2. **同名覆盖**: 内层作用域的声明会隐藏外层作用域的同名标识符。例如: ```cpp int x = 10; // 全局变量 void foo() { int x = 20; // 局部变量,隐藏全局x cout << x; // 输出20(就近原则) } ``` 3. **函数参数与局部变量**: 函数参数属于局部作用域,会优先于外层变量被匹配: ```cpp void bar(int x) { int x = 30; // 错误:重复定义(参数x已存在) // 正确写法:使用不同名称 int y = x; // y使用参数x的值 } ``` 4. **类成员与局部变量**: 在类成员函数中,局部变量会隐藏同名的类成员,需通过`this->`或类名限定访问成员: ```cpp class MyClass { public: int value = 100; void print() { int value = 200; // 隐藏类成员value cout << value; // 输出200 cout << this->value; // 输出100(显式访问成员) } }; ``` 5. **命名空间与全局作用域**: 命名空间中的名称会隐藏全局作用域的同名标识符: ```cpp namespace NS { int var = 42; } int var = 0; int main() { cout << var; // 输出0(全局var) cout << NS::var; // 输出42(通过命名空间限定) } ``` ### 常见问题 - **意外隐藏**:内层作用域的同名变量可能导致外层变量无法访问,引发逻辑错误。 - **ADL(参数依赖查找)**:函数重载时,编译器会根据参数类型在相关命名空间中查找匹配函数,此时就近原则可能扩展到关联作用域。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值