6

私はここ数年、C++ と Java を使用しています。理解できないことの 1 つは、なぜクラスのコンストラクターに名前を付ける必要があるのか​​ということです。たとえばFOO、C++/Java でクラスを定義する必要がある場合FOO、コンストラクター名として指定する必要があります。ただし、コンストラクターは明示的に呼び出されることはないため、結局、コンパイラーに名前を付けることを強制する意味は何ですか。

抽象化のパラダイムは、不必要な詳細をプログラマーから隠します。これが理由です。コンストラクターが返す必要があるものは既に明確に定義されているため、コンストラクターには戻り値の型がありません。同じ精神で、すべてのクラスのコンストラクターに一般的な名前を付けることができないのはなぜですか-たとえば、意味のあるもの、initialize()または何もなく、引数だけ( [arg [,arg]] )

私は自分自身を表現できることを願っています。誰かが決定的な答えを持っている場合は、親切に教えてください。

4

8 に答える 8

3

C ++ではコンストラクターに名前がありません(C ++ 03 12.1)が、コンストラクターは基本的に関数として定義されているため、何らかの方法で名前を付けるのが論理的でした。
クラス名以外の名前を付けると、新しいキーワードが追加されるため、最終的にはクラス名と同じ名前になります。
要するに、それは新しいキーワードを避け、同時に直観性を保証する論理的な決定でした。

于 2012-06-05T05:17:49.420 に答える
2

C++ 標準 (12.1) から (強調鉱山):

コンストラクターには名前がありません。コンストラクターの宣言または定義には、特別な宣言子構文が使用されます。構文は次を使用します。

  • 各 decl-specifier が function-specifier または constexpr のいずれかであるオプションの decl-specifier-seq、
  • コンストラクタのクラス名、および
  • パラメータリスト

C++ では、名前を指定するのではなく、コンストラクターを宣言するために言語作成者によって決定された特別な構文を記述しています。

于 2012-06-05T05:11:05.140 に答える
1

これは言語の標準です。コンストラクターの一般的な名前が必要な場合は、別の言語を学習するか、独自の言語を作成してください。=p

于 2012-06-05T04:58:17.093 に答える
1

Java および C++ の場合、コンストラクター名はクラス名と同じでなければなりません。さらに、戻り値の型を宣言していないため、コンストラクターであることがわかります。コンストラクタを宣言するこの方法は、名前が__init__initialize、またはであるメソッドを宣言するのに役立ちます__constructor__init__これは、コンストラクター名として使用するため、たとえば Python では不可能です。

于 2012-06-05T05:26:01.757 に答える
0

You are right about your line of thought. The syntax Java adopted is just a historical artifact.

In newer languages that support OOP, this redundancy is generally absent. Scala calls it this*, F# calls it new*, Python calls it __init__, Ruby calls it initialize etc.


* Auxiliary constructors anyway. The primary constructors in these languages are class arguments themselves.

于 2012-06-05T06:10:31.797 に答える
0

コンストラクターは特別なメンバー関数であり、コンストラクターは常に「new」演算子によって作成されたメモリ アドレスを返します。1 つの関数は一度に 1 つのものしか返さないため、コンストラクターから他の値を返すことはできません。クラス名と同じコンストラクタ名を定義するのがJavaの標準です。

于 2012-06-05T05:04:24.723 に答える
0

まず、コンストラクタを記述する必要はありません。作成しない場合は、コンパイラがデフォルトのコンストラクタを作成します。

second、場合によっては 1 つを使用する必要があります (たとえば、最終的なクラス変数がある場合、オブジェクトの作成時に初期化する必要があります)。この場合、コンストラクターを作成する必要があり、オブジェクトをインスタンス化するときにそれを使用します。

public class Foo {
    final int a;

    public Foo (int val){
        this.a = val
    }
}

Foo foo = new Foo (23);
于 2012-06-05T05:11:38.657 に答える
-2

コンストラクターを明示的に呼び出すことはできないため、コンストラクターに特別な名前を付ける目的は何ですか? クラスと同じ名前を持つコンストラクターについて:構築は関数内でのみ実行できるため、コンストラクターは関数です。これは特別な関数であるため、他のクラス関数の中でも特別なシグネチャを持つ必要があります。言語設計者は、クラスと同じ名前にすることを望んでいました。

于 2012-06-05T04:54:29.417 に答える