C++编译器如何区分同名局部变量size与成员函数size()?
为啥局部变量
size和成员函数size()同名不会冲突? 嘿,这个问题问得特别细致,我来给你把逻辑理清楚~
首先你完全不用担心冲突,因为编译器能通过语法上下文清晰区分这两个同名标识符:
对于
homework.size()里的size:
它是通过**成员访问运算符.**来调用的,属于homework这个vector<double>对象的成员函数。编译器看到这个语法时,会直接去homework所属的vector<double>类中查找成员函数,和当前作用域的局部变量根本不在同一个查找路径上。对于局部变量
size:
它是你在当前函数作用域下定义的变量,当你直接写size时,编译器才会在当前局部作用域里查找这个标识符。
举个生活化的例子:就像你给自家猫起名叫“阿黄”,小区里也有个邻居叫“阿黄”——当你喊“邻居阿黄”(对应homework.size(),有明确的前缀)和直接喊“阿黄”(对应局部变量size),大家都能清楚区分,编译器也是这个道理。
再补充个容易混淆的情况:如果是在类的成员函数里定义了和成员变量同名的局部变量,那局部变量会遮蔽成员变量(这时候要访问成员变量得用this->),但你的代码里是成员函数调用,和局部变量完全是两种不同的语法场景,所以完全不会有冲突。
比如这种才是遮蔽的情况:
class MyClass { public: int size; void printSize() { int size = 5; // 局部变量遮蔽成员变量 std::cout << size; // 输出5,用的是局部变量 std::cout << this->size; // 要访问成员变量得加this-> } };
回到你的代码,vec_sz size = homework.size();这条语句里,左边的size是局部变量,右边的homework.size()是明确的对象成员函数调用,编译器处理时会分别走不同的查找逻辑,根本不会搞混~
内容的提问来源于stack exchange,提问作者gigis95




