2012-06-05 3 views
6

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

抽象化パラダイムのおもむくままに、私たちは、プログラマから不要な詳細を非表示にします。これはコンストラクタが返さなければならないものが既によく定義されているため、コンストラクタには戻り値の型がありません。同じ考え方で、なぜすべてのクラスのコンストラクタに汎用名を与えることができないのですか?たとえば、initialize()などの意味のあるもの、あるいは単に何も引数がありません。([arg [,arg]])

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

+0

PHPは、コンストラクタ '__construct'の一般名を持っています。 – xbonez

+2

この質問は、[Programmers](http://programmers.stackexchange.com/)に適しています。 –

+1

+1は根本的な考え方です! – WickeD

答えて

2

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

  • オプションの供述指定子-seqのもので、各供述指定子パラメータリスト
機能指定子またはconstexprの、
  • コンストラクタのクラス名、および
  • のいずれかであります
  • C++では、名前を指定していないため、言語作成者がコンストラクタを宣言するために決定した特別な構文を記述しています。

    +0

    はい、私はそれを知っています。しかし、言語設計の観点からは、この構文を強制するのは最適ではありません。私はコンストラクタが他のメソッドのように表現されず、名前が破棄されるが、余分な作業をしなければならないことは面倒だと完全に理解しています。オーバーロードされたバージョンが10個あるクラスを想像してみてください。簡潔な表記法が優れたデザインの選択肢でした。 – VaidAbhishek

    +1

    @VaidAbhishek:それは議論することができます。 C++、C#およびJavaでは、クラスの名前が使用されます。私は個人的にはそれが最も論理的な方法だと思っています。 –

    +0

    @VaidAbhishek:各コンストラクタとデストラクタに対して一度クラス名をコピー/ペーストするのは本当に厄介な作業ですか? – Blastfurnace

    -2

    明示的にコンストラクタを呼び出すことができないので、それに特別な名前を与えることの目的は何ですか?クラスと同じ名前のコンストラクタについて:コンストラクタは関数内でのみ実行できるので、コンストラクタは関数です。それは特別な関数なので、他のクラス関数の中でも特別な署名が必要です。言語デザイナーはクラスと同じ名前を付けたいと考えました。

    1

    これは言語の標準です。コンストラクターの総称名を使用して、別の言語を学習したり、独自の言語を作成したりしたい場合は、 = P

    +2

    評判ポイントを125点待ちます。 – VaidAbhishek

    0

    コンストラクタは、常に「新しい」オペレータにより作成されたメモリアドレスを返すメンバ関数とコンストラクタ特別です。ある関数は一度に1つだけを返すので、他の値はコンストラクタから返すことができません。 クラス名と同じコンストラクタ名を定義するのはJava標準です。 C++標準(12.1)(強調鉱山)から

    +0

    私はセマンティクスを理解していますが、私の質問は設計レベルです。なぜプログラマーに名前を定義させるのか。私はあなたが私の質問を理解していないと思う。 – VaidAbhishek

    0

    まず、あなたは、コンストラクタを記述する必要はありません。 これを書かないと、コンパイラはデフォルトコンストラクタを作成します。

    第2の場合によっては、オブジェクトの作成時に初期化する必要がある最終的なクラス変数がある場合など、1つを使用する必要があります。この場合、コンストラクタを記述する必要があり、オブジェクトをインスタンス化するときにコンストラクタを使用します。Cでは

    public class Foo { 
        final int a; 
    
        public Foo (int val){ 
         this.a = val 
        } 
    } 
    
    Foo foo = new Foo (23); 
    
    3

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

    +0

    はい、あなたは正しいです。しかしここでは、追加のキーワードを追加しないということですが、不要な詳細に見える制約を削除するだけです。たとえば、PHPでは、すべてのクラスで共通のコンストラクタを定義するために、__constructという表記法があります。 Pythonでは、機能のようなコンストラクタを定義するための__init__キーワードもあります。これらの名前は、コンストラクタがその意味においてより明白になるようにします。とにかく、それは設計上の決定だと思うし、将来の反復で改善できるかもしれない。私はちょうどそれを熟考し、それについて意見を求めることに決めました。 – VaidAbhishek

    +1

    @VaidAbhishek:あなたが挙げた言語の例は、新しいキーワードを追加します.C++が設計されたとき、キーワードを最小限に保つ意識的な努力があったため、このような新しいキーワードを使用するとオーバーヘッドになります。 **特別な制約はありません**。他の言語では、キーワードを使用するよう強制されますが、C++ではクラス名を使用するように強制します(*新しいキーワードを作成しない*)。それは単にデザイナーがそう思っていたからです。 –

    +0

    C++には1つ以上の名前が必要です。デストラクタとコピーコンストラクタは現在、名前も持っていません。しかし、現実的なものにしよう:適切なIDEは色分けを使用することができます。関数名として色付けされたクラス名を見ることは、あなたがctorを扱っているという明確な視覚的なヒントです。 – MSalters

    1

    JavaおよびC++の場合、コンストラクター名はクラス名と同じである必要があります。また、戻り型を宣言していないので、コンストラクタであることがわかります。このようにコンストラクタを宣言すると、__init__initialize、または__constructorという名前のメソッドを宣言するのに役立ちます。これは、コンストラクタ名として__init__を使用するなど、Pythonでは不可能です。

    0

    あなたの考え方は正しいですか?採用されたJava構文は歴史的なアーティファクトに過ぎません。

    OOPをサポートする新しい言語では、この冗長性は通常ありません。 ScalaはRubyはとにかくそれinitializeなど


    *補助コンストラクタを呼び出し、それはthis *、F#が、それはnew *、Pythonは__init__それを呼び出す呼び出す呼び出します。これらの言語の主なコンストラクタは、クラス引数そのものです。

    関連する問題