在C++标记成员函数意味着可以在实例上调用它。Java 没有与此等效的。例如:const
const
class Foo {
public:
void bar();
void foo() const;
};
void test(const Foo& i) {
i.foo(); //fine
i.bar(); //error
}
值可以稍后在 Java 中分配一次,例如:
public class Foo {
void bar() {
final int a;
a = 10;
}
}
在Java中是合法的,但不是C++,而:
public class Foo {
void bar() {
final int a;
a = 10;
a = 11; // Not legal, even in Java: a has already been assigned a value.
}
}
在Java和C++成员变量可以分别是/。在类的实例完成构造时,需要为它们赋值。final
const
在Java中,必须在构造函数完成之前设置它们,这可以通过以下两种方式之一实现:
public class Foo {
private final int a;
private final int b = 11;
public Foo() {
a = 10;
}
}
在C++您需要使用初始化列表为成员提供一个值:const
class Foo {
const int a;
public:
Foo() : a(10) {
// Assignment here with = would not be legal
}
};
在Java中,final可以用来将事物标记为不可重写。C++(C++11)不这样做。例如:
public class Bar {
public final void foo() {
}
}
public class Error extends Bar {
// Error in java, can't override
public void foo() {
}
}
但在C++:
class Bar {
public:
virtual void foo() const {
}
};
class Error: public Bar {
public:
// Fine in C++
virtual void foo() const {
}
};
这很好,因为标记成员函数的语义是不同的。(您也可以通过仅具有 on 其中一个成员函数来重载。(另请注意,C++11 允许将成员函数标记为最终状态,请参阅C++11 更新部分)const
const
C++11更新:
C++11 实际上允许您将类和成员函数标记为 ,在 Java 中具有与相同功能相同的语义,例如在 Java 中:final
public class Bar {
public final void foo() {
}
}
public class Error extends Bar {
// Error in java, can't override
public void foo() {
}
}
现在可以在C++11中完全写成:
class Bar {
public:
virtual void foo() final;
};
class Error : public Bar {
public:
virtual void foo() final;
};
我不得不使用G ++ 4.7的预发布来编译这个例子。请注意,在这种情况下,这不会替换它,而是增强它,提供类似Java的行为,而最接近的等效C++关键字则看不到这些行为。因此,如果您希望成员函数同时具有两者,并且您会这样做:const
final
const
class Bar {
public:
virtual void foo() const final;
};
(此处的顺序为必填项)。const
final
以前没有成员函数的直接等价物,尽管使函数成为非-将是一个潜在的选择,尽管在编译时不会导致错误。const
virtual
同样,Java:
public final class Bar {
}
public class Error extends Bar {
}
在C++11中变成:
class Bar final {
};
class Error : public Bar {
};
(以前构造函数可能是您在C++中最接近这一点的构造函数)private
有趣的是,为了保持与预C++11代码的向后兼容性不是通常方式的关键字。(以一个微不足道的、合法的C++98为例,看看为什么把它作为一个关键字会破坏代码)final
struct final;
对象只能调用方法,并且通常被认为是不可变的。const
const
const Person* person = myself;
person = otherPerson; //Valid... unless we declared it const Person* const!
person->setAge(20); //Invalid, assuming setAge isn't a const method (it shouldn't be)
对象不能设置为新对象,但它不是不可变的 - 没有什么可以阻止某人调用任何方法。final
set
final Person person = myself;
person = otherPerson; //Invalid
person.setAge(20); //Valid!
Java没有固有的方法来声明对象不可变;您需要自己将类设计为不可变的。
当变量是基元类型时,/工作方式相同。final
const
const int a = 10; //C++
final int a = 10; //Java
a = 11; //Invalid in both languages
-
一个 Java 文件中的多个枚举类 我有3个带常量的字符串数组。例如: 我正在考虑将这些分别转移到枚举中,因此我将有3个枚举类:,并实现方法。但我不想将它们放在单独的文件中,因为我只有小数据和相同类型的数据。
-
组织 Java 常量的理想方法 我们有一个基于旧jdk 1.4的大型项目。我们已经将Web应用程序迁移到JDK 1.6,但代码中仍然存在许多低效的做法和糟糕的设计。 在主要的痛点上,单个java文件中有2500多行代码。像这样的文件太多
-
我能否将类的名称作为编译时常量获取,而无需将其硬编码在字符串文本中? 我正在研究注释处理器。此代码编译: 但是编译器不认为这是一个常量表达式,而在此上下文中是必需的,因此这也不起作用。 有没有办法在编译时强制类文字进入其名称?
-
Java是否保证内联字符串常量,如果它们可以在编译时确定 请考虑以下情况: 通常,您会期望编译器内联 ONE 和 TWO 常量。但是,这种行为有保证吗?是否可以在运行时部署 Class2 而不在类路径中包含 Class1,并期望它无论编译器如何工作,还是这是可
-
在 scala 注释中使用常量的最佳实践 我使用 tapestry 5 作为我选择的 Web 框架。Tapestry 允许我在配置类中定义符号,并将符号注入到其他组件中。 例如 定义静态常量并将其用作注释值的能力为我提供了编译时检查。 我想知道如何