-6
class T{
public:
    T(){}
};

int main ()
{
  T *t = new T; //line 8

}

コンストラクターに入る前にコードがどのように見えるかということですか? たとえば、8 行目の new 演算子は address を返します。コードはT *t = T 0x0FF00のようになります0x0FF00 T。もしそれが真なら、演算子 new によって返されるこのアドレスは、演算子 new が前に返すという事実にもかかわらず、どのように型 T の後に立っているのでしょうか?

4

1 に答える 1

3
T *t = new T;
//     ^^^^^

tこれはtypeの宣言ですT*。の後の式で初期化されています=new T部分全体が、この初期化子のnew-expressionです。

new-expressionにより、型のオブジェクトにメモリが割り当てられ、そのTオブジェクトがその空間に構築されます。new-expressionは、そのオブジェクトへのポインターを返します。つまり、new-expressionが評価された後、行は次のようになります。

T *t = returned_pointer;

メモリアドレスの例として使用していると思います0x0FF00-その場合、行が次のようになったと想像できます。

T *t = 0x0FF00; // Note: this wouldn't actually compile because 0x0FF00 is an integer literal

ポインタtは、そのメモリ アドレスで初期化されます。

new-expressionが正確に何をするのか混乱するかもしれません。次の 2 つの手順があります。

  1. 適切な割り当て関数 (通常はoperator new) を呼び出し、タイプ のオブジェクトを格納するために必要なメモリのサイズを渡しますToperator newそのメモリを割り当て、その場所を指すアドレスを返します。

  2. T次に、その空間で型のオブジェクトを初期化します。

于 2013-03-16T12:53:59.963 に答える