2012-04-11 22 views
7

Estoy estudiando estructuras de datos (Lista, Pila, Cola), y esta parte del código me está confundiendo.operador de asignación dentro del parámetro de función C++

ListNode(const Object& theElement = Object(), ListNode * node = NULL); 


template<class Object> 
ListNode<Object>::ListNode(const Object& theElement, ListNode<Object> * node) { 
    element = theElement; 
    next = node; 
} 
  1. Por qué existen operadores de asignación dentro de los parámetros de función?
  2. ¿Qué significa Object() hacer?

Respuesta

15

No se trata de operadores de asignación. Esos son default arguments para la función.

Una función puede tener uno o más argumentos predeterminados, lo que significa que si, en el punto de llamada, no se proporciona ningún argumento, se usa el valor predeterminado.

void foo(int x = 10) { std::cout << x << std::endl; } 

int main() 
{ 
    foo(5); // will print 5 
    foo(); // will print 10, because no argument was provided 
} 

En el ejemplo de código que envió, el ListNode constructor tiene dos parámetros con los argumentos por defecto. El primer argumento predeterminado es Object(), que simplemente llama al default constructor para Object. Esto significa que si no se pasa ninguna instancia de Object al constructor ListNode, se usará un valor por defecto de Object(), que solo significa Object construido por defecto.

Consulte también:
Advantage of using default function parameter
Default value of function parameter

+0

Estoy tentado de arriba-voto si desea mencionar que los parámetros por defecto son una de las características más "mal" de C++. Convierten constructores inocentes en la conversión de constructores o constructores por defecto. Ellos dificultan las funciones de 'enlace'. Son un obstáculo cuando solo algunos parámetros deben ser especificados y otros quedan por defecto. – pmr

+0

Yo tampoco. Una talla no sirve para todos. A veces son muy útiles. – Spook

+0

@pmr, no necesariamente estoy de acuerdo contigo en que son "malvados". Son una forma útil de evitar repetirse escribiendo varios constructores, cuando simplemente puede proporcionar un constructor con un parámetro predeterminado. Las implementaciones de la biblioteca estándar a menudo aprovechan esto mediante, p. 'vector (const allocator_type & a = allocator_type());' –

3

Las asignaciones en declaraciones proporcionan valores por defecto para los parámetros opcionales . Object() significa una llamada al constructor predeterminado de Object.

El efecto de los parámetros predeterminados es el siguiente: puede invocar el constructor ListNode con cero, uno o dos parámetros. Si especifica dos expresiones de parámetros, se pasan como de costumbre. Si especifica solo una expresión, su valor se pasa como el primer parámetro y la segunda se predetermina a NULL. Si no pasa ningún parámetro, el primer parámetro se predetermina a una instancia de Object creada con su constructor predeterminado, y el segundo se predetermina a NULL.

Cuestiones relacionadas