2011-02-09 25 views
6

¿Qué '&' significa en C++? como dentro de la función¿Qué significa "&" en C++?

void Read_wav::read_wav(const string &filename) 
{ 

} 

¿Y cuál es su equivalente en C?

Gracias


EDIT 1

Si quiero transformar la función anterior C++ en una función C, ¿lo haría?

+1

http://en.wikipedia.org/wiki/Reference_ (C% 2B% 2B) –

+1

como @Tim Medora dijo http://en.wikipedia.org/wiki/Reference_%28C%2B%2B%29 (pero he corregido el enlace;)) –

+0

@ Hernán Eche - Pegar fallar de mi parte ... ¡Gracias! –

Respuesta

12

En ese contexto, la & hace que la variable de referencia.

Por lo general, cuando se pasa una variable a una función, la variable se copia y la función funciona en la copia. Cuando la función retorna, su variable original no cambia. Cuando pasa una referencia, no se realiza ninguna copia y los cambios realizados por la función aparecen incluso después de que la función retorna.

C no tiene referencias, sino un C++ de referencia es funcionalmente lo mismo que un puntero en C. Realmente la única diferencia es que los punteros tienen que ser dereferenced cuando los utiliza:

*filename = "file.wav"; 

Pero las referencias se puede utilizar como si se tratara de la variable original:

filename = "file.wav"; 

Aparentemente, se supone que las referencias a no ser nula, aunque no es imposible que eso ocurra.

La función C equivalente sería:

 void read_wav(const char* filename) 
    { 

    } 

Esto es debido a que C no tiene string. La práctica habitual en C es enviar un puntero a una matriz de caracteres cuando se necesita una cadena. Al igual que en C++, si escribe una constante

read_wav("file.wav"); 

string El tipo es const char*.

11

Esto significa que la variable es una reference. No hay un equivalente directo en C. Se puede pensar en él como un puntero que se eliminan las referencias de forma automática cuando se usa, y nunca puede ser nulo, tal vez.

La forma típica de representar una cadena en C es mediante un puntero char, por lo que la función de probabilidad se vería así:

void read_wav(struct Read_wav* instance, const char *filename) 
{ 
} 

Nota: el primer argumento aquí simula la implícita referencia this objeto que tendría en C++, ya que parece un método miembro.

+0

¿Estás seguro? – karlphillip

+0

Por favor vea mi primera edición. Gracias :) –

+1

necesita una referencia a la estructura original también - en función del uso, se están utilizando las partes internas de la clase Read_wav –

-3

& nombre de archivo que esto significa es una referencia a nombre de archivo

+1

C no tiene referencias. – unwind

+0

No hay tal como pasar por referencia en C. Este código no se compila en C. –

0

& significa que la variable se pasa a través de referencia. Por lo tanto, dentro de su función no tendrá una copia local de la variable, sino la propia variable original. Todos los cambios en la variable dentro de la función influirán en la variable pasada original.

+0

y es cierto, pero en su caso, ya que hay un calificador const, la variable no se cambiará – Nikko

0

Es posible que desee comprobar Binky Pointer fun, es un video que ilustra qué punteros y referencias son.

1

En C, podría escribir de esta manera:

void read_wav(struct Read_wav* , const char * pSzFileName) 
{ 

} 

std :: string es la forma en C++ de tratar con arreglo de char const.

& es una referencia en C++. Se comporta como si estuvieras manejando el puntero detrás (se trata principalmente de un azúcar sintáctico, se cree que incita al contrato a que el puntero detrás no sea nulo).

+2

Solo lo escribirías de esa manera si fuera 'estático'. Una función miembro no estática requeriría un argumento 'Read_wav *' explícito para reemplazar el 'this' implícito de C++. – dan04

+0

Tienes razón. Yo edito –

0

En este caso, string &filename significa que la función recibirá una referencia (una dirección de memoria) como parámetro, en lugar de recibirla como una copia.

La ventaja de este método es que su función no asignará más espacio en la pila para guardar los datos contenidos en nombre de archivo.

0

Es una referencia, como han dicho otros. En C, lo que probablemente escribir la función como algo parecido a

void read_wav(struct Read_wav* rw, const char* filename) 
{ 

} 
+0

'const char * filename' –

+1

@Foo Bah: O incluso' const char * const filename' :) – GrahamS

1

El signo se utiliza en dos sentidos diferentes en C++: obtención de una dirección de algo (por ejemplo, de una variable o una función) y la especificación de una variable o parámetro de función para ser una referencia a una entidad definida en otro lugar. En tu ejemplo, el último significado está en uso.

C no tiene estrictamente nada que ver con la referencia, pero los punteros (o punteros a punteros) han sido usuarios de edades similares.

Véase p. http://www.cprogramming.com/tutorial/references.html, What are the differences between a pointer variable and a reference variable in C++? o http://en.wikipedia.org/wiki/Reference_%28C%2B%2B%29 para obtener más información acerca de las referencias en C++.

1

En este caso particular, std :: string tiene un método c_str que devuelve un const char *. Se puede hacer una versión paralela C y luego tener su C++ hacer algo como:

void Read_wav::read_wav(const string &filename) 
{ 
    do_read_wav(internal_read_wav, filename.c_str()); 
} 

donde do_read_wav es su rutina C y internal_read_wav es un puntero a una estructura de estilo C.

void do_read_wav(struct Read_wav rw, const char * filename) 

Ahora, si está almacenando la información en la clase, es necesario hacer una estructura C [todos los campos deben ser POD, etc.]

1

Las referencias son alias, que son muy similares a los punteros .

std::string es una matriz de char con un length explícito (es decir, puede haber caracteres nulos incrustados dentro).

Hay una biblioteca C para emular std::string (es decir, proporcionar una interfaz encapsulada) llamada bstring para Better String Library. Lo libera del tedio de tener que lidiar con dos variables distintas (matriz y longitud).

No puede usar las clases en C, pero puede emularlas con struct reenviado (para imponer la encapsulación) y los métodos de clase simplemente se convierten en funciones regulares con un parámetro explícito.

En total, esto lleva a la siguiente transformación:

void Read_wav::read_wav(const string &filename); 

void read_wav(struct Read_wav* this, struct bstring const* filename); 

Qué (aparte del ruido struct) es muy similar a lo que había antes :)