「新しいオペレーター」と「新しいオペレーター」の違いは何ですか?
new演算子を使用することです。この演算子はオーバーロードされる可能性があります。デフォルトのオペレーターとオーバーロードされたバージョンを区別するために、デフォルトは「新しいオペレーター」と呼ばれ、オーバーロードされたバージョンは「オペレーターnew」と呼ばれます。
「新しいオペレーター」と「新しいオペレーター」の違いは何ですか?
new演算子を使用することです。この演算子はオーバーロードされる可能性があります。デフォルトのオペレーターとオーバーロードされたバージョンを区別するために、デフォルトは「新しいオペレーター」と呼ばれ、オーバーロードされたバージョンは「オペレーターnew」と呼ばれます。
回答:
私は通常、2つを少し上手に区別するために別の言い方をするようにしていますが、いずれにしても良い質問です。
演算子newは、生のメモリを割り当てる関数です。少なくとも概念的には、と大差ありませんmalloc()。独自のコンテナのようなものを書いていない限り、これはかなり珍しいことですが、次のように直接operator newを呼び出すことができます。
char *x = static_cast<char *>(operator new(100));
演算子newをグローバルに、または特定のクラスにオーバーロードすることもできます。IIRC、署名は次のとおりです。
void *operator new(size_t);
もちろん、演算子new(グローバルまたはクラスのいずれか)をオーバーロードする場合、一致する演算子の削除もオーバーロードする必要があります。価値のあるものとして、配列にメモリを割り当てるために使用される別の演算子new []もありますが、ほとんどの場合、混乱を完全に無視する方がベターです。
新しい演算子は、無料ストアからオブジェクトを作成するために通常使用するものです。
my_class *x = new my_class(0);
2つの違いは、演算子newがrawメモリを割り当てるだけで、それ以外には何もないということです。new演算子は、operator newを使用してメモリを割り当てることから始まりますが、適切なタイプのオブジェクトのコンストラクターを呼び出すため、結果はそのメモリ内に作成された実際のライブオブジェクトになります。そのオブジェクトに他のオブジェクトが含まれている場合(埋め込みクラスまたは基本クラスとして)、それらのコンストラクターも呼び出されます。
operator delete(x);。
「新しいオペレーター」
class Foo
{
public:
void* operator new( size_t );
}
「新しいオペレーター」:
Foo* foo = new Foo();
この例でnew Foo()は、Foo::operator new()
つまり、operator new()+演算子が呼び出すのと同じように、「新しい演算子」が「」を呼び出しますoperator +()
newC ++では演算子ではありません。sizeofたとえば、は演算子ですがnew、そうでdeleteはありません。newおよびdeleteはキーワードであり、これらのキーワードによって形成される構文構造は、new-expressionおよびdelete-expressionと呼ばれます。
sizeof構文構文でありnew、delete両方とも有効で合法なオーバーロード可能な演算子です。私が今まで見たすべてのものから、newそしてdelete両方ともオペレーターです。[cplusplus.com] [ cplusplus.com/doc/tutorial/classes2/]を
operator new関数」などの用語があります。ここでも、sizeof一方でexplicilty、「オペレータ」と呼ばれているnewとdeleteされている決してオペレーターと呼ばれていません。
以下は、スコット・マイヤーズのより効果的なC ++の本からの引用です。
new演算子は、必要なメモリ割り当てを実行する関数を呼び出し、その関数を書き換えまたはオーバーロードして、その動作を変更できます。newオペレーターがメモリを割り当てるために呼び出す関数の名前はoperator newです。
「新しいオペレーター」と「新しいオペレーター」の間に違いはありません。どちらも同じことを指しoperator newます。通常、new-expressionsによって作成されたオブジェクトに未加工のメモリ割り当てを実行するオーバーロード可能/置換可能関数です。
また、どちらの用語も言語仕様には含まれていないことにも注意してください(公式用語の定義ソースです)。
あなたが使用する場合はnew、オブジェクトを作成するために、あなたのプログラムでは、それが呼ばれる新しい表現。new-expressionは、キーワードnewと、文法で定義された追加の構文部分で構成されます。この式の構文のどの部分も「演算子」と呼ばれることはありません。
生のメモリ割り当て関数operator newは、正式には単に「operator new関数」と呼ばれます。このシーケンスの単語operatorとnewは、2つの別個のC ++言語キーワードにすぎないことに注意してください。彼らは英語の用語「オペレーター新」を形成しません。言語仕様のどこにも、英語の用語としての「operator new」への言及はありません。これは毎回、メモリ割り当て関数の宣言構文を生成する2つの独立したキーワードの組み合わせです。
繰り返しになりますが、正式にはC ++には、「operator new」や「new operator」などの英語の用語はありません。前者のシーケンスは、英語の用語としてではなく、単なるキーワードの組み合わせとして言語仕様に存在します。後者はまったく存在しません。
OPの質問は適切に表現されていません。「新しいオペレーター」と「新しい表現」の違いを段階的に示した方がいいですか?「オペレーターの新しい」はしばしば「オペレーターの新しい機能」も指します。
そして、周りにはたくさんの正しい答えがあります、以下は私のものです:
1> 'new expression'は 'operator new'を呼び出してrawメモリを割り当て、次にコンストラクタを呼び出します
apple * p = new apple(); //new expression
2> 'operator new'はrawメモリのみを割り当て、mallocとの違いはあまりありません
void* mem = operator new(sizeof(apple)); //just like calling malloc()
apple* p2 = new(mem) apple(1); //call construct here using placement new.
新しい演算子:C ++は、新しい演算子を使用したオブジェクトの動的割り当てをサポートしています。新しいオペレーターは、フリーストアと呼ばれるプールからオブジェクトにメモリを割り当てます。new演算子は、特殊関数演算子newを呼び出します。
operator new:要求が0バイトのストレージに対するものである場合、operator newは別個のオブジェクトへのポインターを返します(つまり、operator newを繰り返し呼び出すと、別のポインターが返されます)。割り当て要求に十分なメモリがない場合、オペレーターnewはNULLを返すか、例外をスローします。operator newの最初の引数は、size_t型(STDDEF.Hで定義されている型)である必要があり、戻り値の型は常にvoid *です。
詳細については、MSDNリンクを以下に示します。
newは演算子であり、キーワードでもあります。
[1] 2.13および&2.12を参照してください。
newは2つのことを行います。T* t = new T(arg);
1)オブジェクトにメモリを割り当てます:void * ptr = operator new(sizeof(T));
// 演算子newは関数(cのmallocと同じ)であり、演算子ではありません(3.7.4の[1]を参照)。しかし、項目7 [2]もオペレーターであると述べています。私の意見では、演算子と関数の違いは小さく、演算子のオーバーロードは関数によって実装されていることを思い出すとわかります。
//ここで必要な処理を実行するこのoperator / function(operator new)をオーバーロードできます。
2)割り当てられたメモリ内のオブジェクトを初期化:ptrでT :: T(arg)を呼び出します
// コンパイラのみがこれを行うことができます。私もあなたもできません。
// Tにメンバーオブジェクトのコンストラクターと基本クラスのコンストラクターがある場合、コンパイラーもそれらを呼び出します。そして、この呼び出しは再帰的です。コンパイラだけがそれを行うことができます。
したがって、オペレーターnewはnewのミッションの一部を実行し、この部分でのみ、何かを実行できます。
[1]:ISO / IEC、N3690。http://ww.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf
[2]:マイヤーズ、スコット。効果的なC ++、3番目。