类方法和具有相同名称的变量,C ++中的编译错误不在Java中?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类方法和具有相同名称的变量,C ++中的编译错误不在Java中?相关的知识,希望对你有一定的参考价值。

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中?

答案

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

&Test::isVal

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

在C ++中,包括我在内的很多人通常都会特别调用数据成员,比如在他们的名字前加上m。这避免了这个问题:

class Test 
public:
    bool IsVal() const  return mIsVal; 
private:
    bool mIsVal;
;
另一答案

C ++将名称修改应用于函数名称和全局变量。局部变量不会受损。出现问题是因为在C中你可以访问变量或函数的地址(因此在C ++中也可以) :

struct noob
    bool noobvar;
    void noobvar();
;

可以说,为什么不将名称修改应用于局部变量,然后有一个内部本地表示,如

bool __noobvar_avar;
void __noobvar_void_fun;

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

但是,如果我们在代码中的某处写:

&noob::noobvar

该计划应该做什么?

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

您可以看到,因为在C中,因此在C ++中,您可以发出“地址”,在相同的分辨率范围内使用具有相同名称的变量和函数是不合法的。

另一答案

c / c ++中的函数只是指向代码所在的内存中的位置的指针,isVal(作为布尔值)和isVal(作为函数)因此是不明确的。

另一答案

快速回答是“因为这就是C ++的工作方式。”对于成员变量和成员函数(即“方法”),C ++没有单独的名称空间,其中Java(显然,我没有尝试过)。

在任何情况下,请记住关于那个去看医生的人的老故事并说“Doc,当我这样做时会疼。”医生回答说“好吧,不要那样做!”这是成为一个愚蠢的程序员伎俩的语言特点。

另一答案

C ++草案标准N3337的以下部分指定何时可以重载名称。

13超载

1如果为同一范围内的单个名称指定了两个或更多不同的声明,则称该名称已重载。通过扩展,在同一范围内声明相同名称但具有不同类型的两个声明称为重载声明。只有函数和函数模板声明可以重载;变量和类型声明不能重载。

将类定义为:

class Test 

      bool isVal() const 
          return isVal;
      

  private:

      bool isVal;
;

你在班级范围内重载名称isVal。仅当isVal是成员函数时才允许这样的重载。当isVal是成员变量时,不允许这样做。

另一答案

如果你有一些理由为变量和方法使用相同的名称(也许减少命名的东西几乎有相同的目的等等),我建议只用不同的情况命名它们:

class Test 

    private bool isVal;
    public bool ISVAL() 
       return isVal;  

以上是关于类方法和具有相同名称的变量,C ++中的编译错误不在Java中?的主要内容,如果未能解决你的问题,请参考以下文章

C#中具有相同名称和签名但返回类型不同的方法

JAVA-初步认识-第六章-成员变量和局部变量的显示初始化

暑假学习进度报告6

以编程方式从风暴螺栓中杀死拓扑时编译错误:对象和包具有相同的名称

通过C学Python关于语言数值类型和变量

二.初始化方法