4

Cでは、voidポインタは暗黙的に別の型に型キャストされます。

以下のプログラムを参照してください。

int main()
{
    void *p;
    int* ptr,i=5;
    p=&i;
    ptr=p; <---------------------------
    return 0;
}

C環境で実行すると、プログラムは正常にコンパイルされます。

ただし、同じプログラムをC ++環境で実行すると、次のエラーが発生します。

prog.cpp: In function ‘int main()’:
prog.cpp:8: error: invalid conversion from ‘void*’ to ‘int*’

これは、C ++では、ポインターを明示的に型指定する必要があることを意味しvoidます。

では、なぜnew演算子の戻り型がvoid *なのですか?どのように、それは希望のタイプに変換されていますか?

4

7 に答える 7

3

をオーバーロードoperator newすると、実際にvoid*. オーバーロードは、基本的に Coperator newのような単純な割り当て関数です。malloc()

しかし、operatorを使用するnewと、その関数を呼び出すだけではありません。たとえば、コンストラクターも暗黙的に呼び出します。new正確に正しい型を返すことは、 で構築する場合とオーバーロードされたoperator new関数の間のもう 1 つの暗黙の違いです。

C++ では、何かvoid*を指す可能性があるため、エラーが発生します。したがって、それを特定のものに割り当てようとすると、正しくない可能性があるという仮定を立てていることになります。C++ は厳密に型指定されているため、コンパイラに仮定を伝え、それを明示する必要があります。これが、タイプ セーフが提供する保護メカニズムです。C は強く型付けされていないため、注意するのは開発者の責任です。

于 2012-08-08T13:18:00.053 に答える
1

C ++は、ポインターキャストに対してより厳密なルールを課します。その理由の1つは、おそらくC ++でのポインターキャストが最終的にマシンコードにつながる可能性があるためです。つまり、それは純粋に表面的なものではありません。

たとえば、クラスはandを(この順序で)A継承します。にポインタを取り、それをキャストすると、この結果は(生の)ポインタシフトになります。BCCA

于 2012-08-08T13:18:01.567 に答える
1

次のように入力する必要があります。

  ptr = (int *) p;

newの結果はvoid*ではありません。作成するオブジェクトによって異なります。もし、するなら

  ptr = new int [2];

再キャストは必要ありません。

于 2012-08-08T13:18:33.017 に答える
1

演算子はnewコンパイラによって特別に扱われ、引数から型を取得newし、正しい型に暗黙的にキャストします。

独自のものを作成する場合operator newは、ポインターを返す必要がありvoidます。実際には型がわからないため、割り当てる必要があるメモリの量だけです。

于 2012-08-08T13:17:23.080 に答える
1

newは関数ではないため、演算子であり、コンパイラによって特別に処理されます。

于 2012-08-08T13:17:26.840 に答える
0

では、なぜnew演算子の戻り型がvoid *なのですか?

newのような新しい式で使用されるキーワードを意味しますint * p = new int[42];か?この場合、その式のタイプは正しいint*ため、変換は必要ありません。

それとも、メモリ割り当て機能を意味しますoperator new()か?のようmalloc()に、それは型付きオブジェクトではなく生のメモリを扱っているので、その戻り型は型なしvoid*です。これは、作成中のオブジェクトのタイプを認識しているため、オブジェクトが完全に構築されたら必要なポインター変換を実行できるnew-expressionによって内部的に使用されます。

ごくまれに、独自のコードで使用する場合は、自分で正しいタイプに変換する必要があります。ただし、ほとんどの場合、new-expressionを介して間接的に使用するため、そのような詳細について心配する必要はありません。

于 2012-08-08T13:54:55.010 に答える
-1

http://www.cplusplus.com/reference/std/new/operator%20new/

演算子newは通常の関数として明示的に呼び出すことができますが、C ++では、newは非常に特殊な動作をする演算子です。new演算子を使用した式は、最初に型指定子のサイズを最初の引数として関数演算子newを呼び出します。これが成功すると、オブジェクトが自動的に初期化または構築されます(必要な場合)。最後に、式は適切な型へのポインターとして評価されます。

最後の文に注意してください。

于 2012-08-08T13:18:08.520 に答える