类方法和变量同名,编译错误在C++不是在Java中?

2022-08-31 20:48:31
class Test {

      bool isVal() const {
          return isVal;
      }

  private:

      bool isVal;
};

在编译此文件时,它说

testClass.cpp:9: 声明 'bool Test::isVal'

testClass.cpp:3:与之前的声明 'bool Test::isVal()' 冲突

尽管这同样适用于java

class Test {

  private boolean isVal;

  public boolean isVal() {
      return isVal;
  }

}

为什么编译错误发生在C++而不是Java中?


答案 1

因为C++不是Java。您可以获取成员的地址:

&Test::isVal

因此,不能让两个成员具有相同的名称,除非可以重载成员函数。即使你可以通过某种演员来消除歧义,下一个问题也会在其他地方出现。

在C++,包括我在内的很多人通常专门称呼数据成员,比如在他们的名字前加上一个。这避免了以下问题:m

class Test {
public:
    bool IsVal() const { return mIsVal; }
private:
    bool mIsVal;
};

答案 2

C++将名称重整应用于函数名称和全局变量。局部变量不会被破坏。问题之所以出现,是因为在C中,您可以访问变量或函数的地址(因此在C++中也是如此),例如:

struct noob{
    bool noobvar;
    void noobvar(){};
};

可以说,为什么不将名称重整也应用于局部变量,然后具有内部局部表示,例如

bool __noobvar_avar;
void __noobvar_void_fun;

并假设它们在执行期间分别收到0x000A和0x00C0地址。

但是,如果我们在代码中的某个地方编写:

&noob::noobvar

程序应该怎么做?

  1. 返回变量 noobvar 的地址,即 0x000A
  2. 返回 noobvar 函数的 addres,即 0x00C0

您可以看到,由于在 C 中,因此在 C++ 中,您可以发出“地址”,因此在相同的解析范围内具有相同名称的变量和函数是不合法的。


推荐