gpt4 book ai didi

Java final 与 C++ const

转载 作者:IT老高 更新时间:2023-10-28 11:31:43 26 4
gpt4 key购买 nike

Java for C++ programmers tutorial说(重点是我自己的):

The keyword final is roughly equivalent to const in C++

在这种情况下,“大致”是什么意思?他们不是完全一样吗?

有什么区别(如果有的话)?

最佳答案

在 C++ 中标记成员函数 const 意味着它可以在 const 实例上调用。 Java没有与此等效的。例如:

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 {
}
};

这很好,因为标记成员函数 const 的语义不同。 (您也可以重载,只在其中一个成员函数上使用 const。(另请注意,C++11 允许将成员函数标记为 final,请参阅 C++11更新部分)


C++11 更新:

C++11 实际上允许您将类和成员函数标记为 final,与 Java 中的相同功能具有相同的语义,例如在 Java 中:

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 的预发布版本来编译这个示例。请注意,在这种情况下,这不会替换 const,而是对其进行扩充,提供最接近的等效 C++ 关键字所没有的类似 Java 的行为。因此,如果您希望成员函数既是 final 又是 const 你会这样做:

class Bar {
public:
virtual void foo() const final;
};

(这里需要constfinal的顺序)。

以前没有直接等效的 const 成员函数,尽管使函数成为非virtual 可能是一种可能的选择,尽管不会在编译时导致错误。

Java 也是如此:

public final class Bar {
}

public class Error extends Bar {
}

在 C++11 中变为:

class Bar final {
};

class Error : public Bar {
};

(以前的 private 构造函数可能是你在 C++ 中最接近的)

有趣的是,为了保持与 C++11 之前代码的向后兼容性,final 不是通常的关键字。 (以简单、合法的 C++98 示例 struct final; 了解为什么将其设为关键字会破坏代码)

关于Java final 与 C++ const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4971286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com