2009-12-11 26 views
97

¿Cuál es la diferencia entre "nuevo operador" y "operador nuevo"?¿Diferencia entre 'nuevo operador' y 'operador nuevo'?

+3

Hola, ¿me pueden aclarar la pregunta? Parece que hay un error tipográfico en alguna parte. –

+10

La pregunta está redactada correctamente; consulte las respuestas a continuación. El método para asignar dinámicamente la memoria es usar el operador 'new'. Este operador puede estar sobrecargado. Para distinguir entre el operador predeterminado y una versión sobrecargada, el valor predeterminado se llama "nuevo operador" y la versión sobrecargada se llama "operador nuevo". –

+2

Cómo hacer eso. Soy nuevo y desconozco. – Sandeep

Respuesta

103

Normalmente trato de expresar las cosas de manera diferente para diferenciarlas un poco mejor, pero en cualquier caso es una buena pregunta.

Operador nuevo es una función que asigna memoria bruta; al menos conceptualmente, no es muy diferente de malloc(). A pesar de que es bastante inusual menos que esté escribiendo algo así como su propio contenedor, puede llamar al operador de nuevo directamente, como:

char *x = static_cast<char *>(operator new(100)); 

También es posible sobrecargar el operador nuevo de forma global, o para una clase específica. IIRC, la firma es:

void *operator new(size_t); 

Por supuesto, si se sobrecarga un operador nuevo (ya sea global o para una clase), también querrá/necesidad de sobrecargar el operador de juego eliminar también. Por lo que vale, también hay un nuevo operador [] que se utiliza para asignar memoria a las matrices, pero es casi seguro que es mejor ignorar por completo ese desastre.

El nuevo operador es lo que se utiliza normalmente para crear un objeto de la tienda libre:

my_class *x = new my_class(0); 

La diferencia entre los dos es que el nuevo operador simplemente asigna memoria en bruto, nada más. El nuevo operador comienza utilizando un operador nuevo para asignar memoria, pero luego invoca el constructor para el tipo correcto de objeto, por lo que el resultado es un objeto vivo real creado en esa memoria. Si ese objeto contiene cualquier otro objeto (ya sea incrustado o como clases base) esos constructores también se invocan.

+14

+1, en cuanto a una redacción diferente, el estándar usa * nueva expresión * por todas partes, y solo una vez usa * nuevo operador * para referirse al lugar de llamada. Tiendo a hacer lo mismo: * operador nuevo * para el * asignador * y * nueva expresión * para el uso. –

+3

Una nueva expresión es la frase completa que comienza con nueva. Entonces, ¿cómo llamas solo la parte "nueva"? Si es incorrecto llamar al nuevo operador, entonces no deberíamos llamar "sizeof" al operador de sizeof, ni a & the-of-operator (cuando se comporta como uno). – Kaz

+1

Siguiendo con la observación de Kaz, tal vez la pregunta debería reformularse como: ¿Cuál es la diferencia entre el nuevo operador y el operador nuevo operador? :) –

6

Cuando se crea un nuevo objeto de la memoria es asignada usando operador nueva continuación, el constructor se invoca para inicializar la memoria. El nuevo operador hace tanto la asignación como la inicialización, mientras que el operador nuevo solo realiza la asignación.

20

A continuación se presenta la cita de libro más eficaz C++ de Scott Meyers:

El nuevo operador llama a una función de realizar la necesaria asignación de memoria , y se puede volver a escribir o sobrecarga que funciona para cambiar su comportamiento. El nombre de la función que llama el nuevo operador para asignar memoria es operador nuevo.

+6

El término es obviamente inventado por el autor del libro (o, tal vez, tomado de una fuente obsoleta). En la nomenclatura formal de C++ no existe el término "nuevo operador". – AnT

+2

@AndreyT: Hice una búsqueda del C++ 11 para "nuevo operador" y lo encontré hace referencia en cuatro lugares.Específicamente, dos referencias al "operador nuevo de ubicación" –

29

"nuevo operador"

class Foo 
{ 
public: 
     void* operator new(size_t); 
} 

"nuevo operador":

Foo* foo = new Foo(); 

En este ejemplo, new Foo() llamadas Foo::operator new()

En otras palabras, "nuevo operador" llama " operator new() "al igual que el operador + llama al operator +()

+11

'new' no son operadores en C++. 'sizeof', por ejemplo, es un operador, pero' new' y 'delete' no lo son. 'new' y' delete' son palabras clave y las construcciones sintácticas que forman estas palabras clave se llaman * new-expression * y * delete-expression *. – AnT

+2

Uh, en todo caso, 'sizeof' es la construcción sintáctica, y' new' y 'delete' son operadores válidos, legales y con sobrecarga. De todo lo que he visto, 'new' y' delete' son ambos operadores. Ver [cplusplus.com] [http://cplusplus.com/doc/tutorial/classes2/] –

+0

Whoops. Enlace fallido Aquí está el crudo: http://cplusplus.com/doc/tutorial/classes2/ –

8

No hay diferencia entre "nuevo operador" y "operador nuevo". Ambos se refieren a lo mismo: la función operator new sobrecargable/reemplazable que normalmente realiza la asignación de memoria bruta para objetos creados por nuevas expresiones.

Tenga en cuenta también ese término ni está presente en la especificación del lenguaje (que es la fuente de la definición de la terminología oficial).

Cuando se utiliza new en su programa para crear un objeto, se llama nueva expresión. Nueva expresión consiste en la palabra clave new y partes sintácticas adicionales definidas por la gramática. Ninguna parte de la sintaxis de esta expresión se conoce como "operador".

La función de asignación de memoria bruta operator new se conoce oficialmente como solo "operator new función". Tenga en cuenta que las palabras operator y new en esta secuencia son solo dos palabras clave separadas del lenguaje C++. No forman un término en inglés "operador nuevo". En ninguna parte de la especificación del lenguaje encontrará referencias a "operador nuevo" como un término en inglés. Cada vez esto es solo una combinación de dos palabras clave independientes que producen una sintaxis de declaración para una función de asignación de memoria.

Nuevamente, en resumen: formalmente en C++ no existen términos en inglés como "operador nuevo" u "nuevo operador". La secuencia anterior está presente en la especificación del lenguaje como una mera combinación de palabras clave, no como un término en inglés. El último no está presente en absoluto.

+14

Pareces perdido en una pedante masturbación mental. El estándar es impreciso en algunos puntos, y este es uno de ellos. Tiene tanto sentido "discutir el nuevo operador" como "discutir el operador más" o "discutir el operador +". –

+0

AnT - Definitivamente estoy de acuerdo con usted (+1) – Belloc

2

El nuevo operador: C++ admite la asignación dinámica de objetos utilizando el nuevo operador. El nuevo operador asigna memoria para objetos de un grupo llamado tienda gratuita. El nuevo operador llama al operador de función especial nuevo.

operador nueva: Si la solicitud es para cero bytes de almacenamiento, nuevos equipos de servicio devuelve un puntero a un objeto distinto (es decir, las repetidas llamadas a operador de nuevo de retorno diferentes punteros). Si no hay suficiente memoria para la solicitud de asignación, el operador new devuelve NULL o lanza una excepción. El primer argumento para el operador new debe ser de tipo size_t (un tipo definido en STDDEF.H), y el tipo de retorno siempre es nulo *.

que aquí hay una enlaces MSDN para obtener más detalles: pregunta

The operator new Function

The new Operator

+1

Ligera aclaración: el operador de no colocación nuevo siempre debe recurrir a la falla de asignación (de acuerdo con la norma); y los formularios de colocación, como ':: new (std :: nothrow)', pueden hacer cualquiera de los dos (ese ejemplo específico devuelve un puntero nulo). –

3

del PO no está redactada correctamente. ¿Es mejor realizar una fase como 'Diferencia entre' operador nuevo 'y' nueva expresión '?' Note que 'operador nuevo' a menudo se refiere a 'operador nueva función' también.

Y hay un montón respuesta correcta en torno, a continuación es mío:

1> 'nueva expresión' llamada 'nuevo operador' para asignar memoria en bruto, entonces llamada al constructor

apple * p = new apple(); //new expression 

2> 'operador nuevo' sólo asignar memoria en bruto, no hay mucha diferencia de malloc

void* mem = operator new(sizeof(apple)); //just like calling malloc() 
apple* p2 = new(mem) apple(1); //call construct here using placement new. 
1
  1. nueva es un operador, así como una palabra clave.

    ver [1] En 2.13 & & En 2.12.

  2. new hace dos cosas: T * t = new T (arg);

    1) asignar memoria para el objeto: void * ptr = operador nuevo (sizeof (T));

    // operador nuevo es una función (como malloc en c), no un operador. (Ver [1] En 3.7.4). Pero el artículo 7 [2] dijo que también es un operador. En mi opinión, la diferencia entre el operador y la función es pequeña, y puedes verla cuando recuerdas que el operador de sobrecarga está implementado por funciones.

    // podemos sobrecargar este operador/función (operador nuevo) hacer lo que queremos sólo aquí.

    2) inicializar el objeto en la memoria asignada: llamar T :: T (arg) en ptr

    // única compilador puede hacer esto. Ni yo ni tú podemos.

    // También compilador invocar constructores objetos miembro y el constructor de la clase base si T tiene. Y esta invocación es recursiva. Solo el compilador puede hacer eso.

  3. Así, el operador de nuevo hace parte de las misiones de nuevo, y sólo en esta parte podemos hacer algo.

    [1]: ISO/IEC, N3690. http://ww.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf

    [2]: Meyers, Scott. Efectivo C++, 3ro.

Cuestiones relacionadas