在C ++中,当我创建如下所示的对象时,不能再为同一个类创建对象。
Box Box; //Box is the class Name
这里Box成为一个对象,每当我们再次使用Box
时,编译器会将其识别为一个对象。但就java而言,这不是。
Box Box = new Box();
Box box = new Box(); //valid
这背后的原因是什么?
答案 0 :(得分:7)
基本上,Java的语法规则略有不同。当语法说你有一个带有初始化程序的变量声明时,例如:
Box box = new Box();
...它知道Box
必须是类型的名称,而不是变量的名称。因此,范围内是否存在名为Box
的变量并不重要。 (这也适用于new
运算符。)
我不知道C ++语法的详细细节,但听起来并没有设置它来区分,至少在你给出的例子中。这不是它的功能 - 这只是编译器如何查找名称的问题。
答案 1 :(得分:5)
Java正在为不同类型的标识符使用不同的命名空间。 Java的受限语法使您无论是指类型,函数,变量还是标签都是明确的。
答案 2 :(得分:2)
有关名称查找如何在C ++中工作的详细信息,请参阅标准中的第3.4节。
在您描述的基本思想的情况下:对于非限定名称(如Box代码),编译器在向上移动之前开始在当前作用域中搜索声明。当它找到该名称的声明,任何声明时,它就会停止。 因此,在您的情况下,当您尝试声明一个类型为Box的新变量时,它会找到变量' Box'的声明。并停止搜索。它只是假设' Box'是一个变量名,不再看。