オペレーターnew
は次の 2 つのことを行います。
- 新しいオブジェクトにメモリを割り当てます (例では、そのメモリ部分へのポインタが obj に割り当てられます)。
- オブジェクトをデフォルト値で初期化するコンストラクターを呼び出します。
その意味で、コンストラクターは何も返しません。new
オブジェクトを返すのは演算子です。コンストラクタはデコレータとして機能します。メモリの一部を受け取り、そのメモリ内のさまざまなバイトをデフォルト値で初期化します。
また、コンストラクターには戻り値の型が必要であるという最初のポイントにも答えます。コンストラクターは、オペレーターによって割り当てられた一部のデータのみを初期化するnew
ため、何かを返すことはできませんnew MyClass()
。実際、何かを返したい場合、式は同時に 2 つの型を返す必要があるためです!! 1 つの型はオペレーターによって割り当てられたオブジェクトnew
であり、2 番目の型はコンストラクターによって装飾された同じオブジェクトです。
定義にこだわりたい場合method
は、説明の名前を別のものに変更することをお勧めします (デザイン パターンのように、デコレータなど)。
そして、メソッドが型を返さなければならないと誰が言いましたか? 抽象メソッドはどうですか? それらは何かを返しますか?
編集していくつかの質問に答えます:
ええ、抽象メソッドには戻り値の型がありますが、実際には何も返さず、定義したインターフェイスを実装するメソッドのみを返します。私の要点は、メソッドとして定義されているものすべてが型を返さなければならないわけではないことを示すことでした。メソッド (または言語構成体) の中には、呼び出し方に関係なく、何かを返すものと返さないものがあります。
コンストラクターの場合、実際には何も返さないという事実を除けば、他の通常のメソッドと非常に似ているため、何も返さないメソッドの観点からそれらを定義する方が簡単だったと思います。何も返さないメソッドのような構造の別の定義を作成しようとしています。
オペレーターはcreate an objectnew
とは言いません。それは単なる演算子、言語構造です。コードがコンパイルされて実際に存在しなくなると、オブジェクトを表すメモリの一部を割り当てて初期化するためのアセンブラー コードに置き換えられます。new
new MyClass()
実行時に実行する手順を 1 つずつ分解してみましょう。
- Operatorは、クラスのすべての変数とメタデータをそのすべての親クラスと子クラスと共に
new
格納するために必要なサイズのメモリを割り当てます。MyClass
- オペレーターは、class のすべての親クラス
MyClass
(存在する場合) のコンストラクターを実行するようになりました。
- この演算子は、 class のすべての子クラスのコンストラクターを実行します (組み込みクラス自体ではない
MyClass
、格納されているメンバー変数)。MyClass
- オペレーターは、最終的にクラスのコンストラクターを実行し
MyClass
ます。
- オペレーター
new
は、作成されたオブジェクト (または割り当てられたメモリーへのポインター) を返します。
実行するコンストラクターが 1 つしかないことはほとんどありません。クラスに親クラスがあり、内部にカスタム クラスを保持しているnew
場合、オブジェクトを返す前に、オペレーターは数十回とは言わないまでも、数回のコンストラクターを実行する必要があります。各コンストラクターが何かを返さなければならない場合、すべての戻り値の型はどこに行くのでしょうか? また、コンストラクターが返すもので何もできない場合、それを行うポイントは何でしょうか?
オペレーターはどんな動物?
ここで紛らわしいのは、演算子の定義だと思います。Operator は呼び出すメソッドではありません。オブジェクトを作成すると言う思考は、2 つのオブジェクトを追加すると言う、またはオブジェクトを比較するとnew
言うのと同じくらい間違っています。演算子はオーバーロードできますが、原則として、演算子は、言語 (コンパイルされたアセンブル コード) が実行する操作を定義する言語構成要素です。たとえば、変数に 2 つのオブジェクトの合計を割り当てる、オブジェクトを作成するなどです。ウィキペディアの演算子を参照してください。+
=