[解決済み] Java の final と C++ の const の比較
質問
その C++プログラマーのためのJavaチュートリアル と書いてあります(ハイライトは私です)。
<ブロッククオートキーワードfinalは おおよそ C++のconstと同等
この文脈での "roughly" の意味は何ですか?それは まさに 同じですか?
違いがあるとすれば、それは何ですか?
解決方法は?
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では、コンストラクタが終了する前に設定する必要があります。これは、2つの方法のうちの1つで実現できます。
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では、クラスとメンバ関数の双方に
final
といったように、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;
};
(の順番は
const
と
final
が必要です)。
以前は、直接的に相当する
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;
をキーワードにすると、なぜコードが壊れてしまうのかがわかります)
関連
-
[解決済み] JavaBeanとは何ですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] Static readonly」対「const」。
-
[解決済み] HashMapを直接(リテラルに)初期化する方法は?
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】Javaでfinalキーワードを使用するとパフォーマンスが向上しますか?
-
[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スタイルシートとして解釈されるリソースが、MIMEタイプtext/htmlで転送される。
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
final, finally, finalizeの違いについて話してください。
-
SpringBootApplication を型解決できない。
-
をインスタンス化することができません。
-
java Mail send email smtp is not authenticated by TLS encryption solution.
-
eclipseにプロジェクトをインポートした後、Editorにmain typeが含まれない問題
-
Java コンパイルエラー - スレッド "main" で例外 java.lang.Error: 未解決のコンパイル問題です。
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
javaでよく使われる英単語