You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动