tipos - ¿C++ pasa objetos por valor o referencia?
punteros c++ (4)
Una pregunta simple para la cual no pude encontrar la respuesta aquí.
Lo que entiendo es que al pasar un argumento a una función durante la llamada, por ejemplo
void myFunction(type myVariable)
{
}
void main()
{
myFunction(myVariable);
}
Para tipos de datos simples como int
, float
, etc., la función se llama por valor.
Pero si myVariable
es una matriz, solo se pasa la dirección de inicio (aunque nuestra función es una llamada por valor).
Si myVariable
es un objeto, también solo se pasa la dirección del objeto en lugar de crear una copia y pasarla.
Volviendo a la pregunta. ¿C ++ pasa un objeto por referencia o valor?
C ++ hace que ambos pasen por valor y pasen paradigmas de referencia posibles.
Puede encontrar dos ejemplos de usos a continuación.
http://www.learncpp.com/cpp-tutorial/72-passing-arguments-by-value/
http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/
Las matrices son construcciones especiales, cuando pasa una matriz como parámetro, se pasa un puntero a la dirección del primer elemento como valor con el tipo de elemento en la matriz.
Cuando pasa un puntero como parámetro, implementa usted mismo el paradigma de pasar por referencia, como en C. Debido a que cuando modifica el objeto en la dirección especificada, modifica exactamente el objeto en la función de llamador.
C ++ pasa argumentos que no son punteros (int *) o referencias (int &) por valor. No puede modificar la var del bloque de llamada en la función llamada. Las matrices son punteros.
C ++ siempre le da la opción: Todos los tipos T
(excepto las matrices, ver a continuación) se pueden pasar por valor haciendo el tipo de parámetro T
, y se pasan por referencia haciendo que el parámetro escriba T &
, reference-to- T
.
Cuando el tipo de parámetro no está explícitamente anotado para ser una referencia ( type &myVariable
), siempre se pasa por valor independientemente del tipo específico. Para los tipos definidos por el usuario también (para eso está el constructor de copias). También para los punteros, aunque copiar un puntero no copia lo apuntado.
Las matrices son un poco más complicadas. Las matrices no se pueden pasar por valor, los tipos de parámetros como int arr[]
son en realidad una sintaxis diferente para int *arr
. No es el acto de pasar a una función que produce un puntero desde una matriz, prácticamente todas las operaciones posibles (excluyendo solo algunas como sizeof
) hacen eso . Uno puede pasar una referencia a una matriz, pero esta anotada explícitamente como referencia: int (&myArray)[100]
(tenga en cuenta la y comercial).
Los argumentos se pasan por valor, a menos que la firma de la función especifique lo contrario:
- en
void foo(type arg)
,arg
se pasa por valor independientemente de si eltype
es un tipo simple, un tipo de puntero o un tipo de clase, - en
void foo(type& arg)
,arg
se pasa por referencia.
En el caso de las matrices, el valor que se pasa es un puntero a los primeros elementos de la matriz. Si conoce el tamaño de la matriz en tiempo de compilación, también puede pasar una matriz por referencia: void foo(type (&arg)[10])
.