¿Existe un equivalente a la palabra clave C# 'out' para los parámetros out pero en C++?palabra clave 'fuera' en C++
Me gustaría que un constructor también establezca un par de referencias a las variables a las que se llama.
¿Existe un equivalente a la palabra clave C# 'out' para los parámetros out pero en C++?palabra clave 'fuera' en C++
Me gustaría que un constructor también establezca un par de referencias a las variables a las que se llama.
Sin equivalente directo. En C++ usted elige entre pasar por valor, pasar un valor de puntero o pasar un parámetro de referencia. Los dos últimos se pueden usar para recuperar datos de la función.
VOID foo(int* pnA, int& nB)
{
*pnA = 1;
nB = 2;
}
int nA, nB;
foo(&nA, nB);
// nA == 1, nB == 2;
¡Maldición! ¡Necesito acelerar! +1 – Phil
(Y debería preferir una referencia a un puntero, ya que la semántica es más clara: el objeto debe existir antes de --i.e.no se puede pasar un puntero nulo) –
Argumentaría que pasar una referencia en C++ es * el * equivalente al C# 'out'. Ambos cambian la semántica de call-by-value a call-by-reference. De acuerdo, la versión de C# es más estricta para garantizar la asignación dentro de la función ... pasar un puntero, sin embargo, sigue siendo llamada por valor y se puede emular en C# con objetos mutables (o 'inseguro'). –
No necesita la palabra clave out. Usas punteros.
int x = 47;
f(&x);
//x is 5
void f(int* p)
{
*p = 5;
}
Mira lo que hice allí? Pasa la referencia de x a la función, por lo que la función realmente escribe un nuevo valor en x.
punteros no son el equivalente. con C# 'out', usted _inicializa_ ese parámetro en alguna función. –
C# 's out
significa que inicialización de algún valor se realiza dentro de una función. C++ no tiene un equivalente.
La inicialización de las variables que no son miembro es siempre hecho en el punto de declaración, y para las variables miembro se hace en el constructor, antes de la llave de apertura del cuerpo del constructor.
Por suerte, moderno compiladores de C++ ejercen RVO (Return Value Optimization), corrección de modo const por lo general se produce en ninguna penalización en el rendimiento:
const Foo foo = create_a_foo();
Un buen compilador emitirá algo como el siguiente código p:
BYTE foo_store [sizeof (Foo)];
create_a_foo (foo_store);
const ALIAS Foo foo = foo_store;
Dónde ALIAS simplemente sería otro nombre (mecanografiado) para foo_store, sin ningún costo de tiempo de ejecución. La asignación de memoria para foo_store generalmente también es gratuita, ya que básicamente no es más que un incremento de cuadro de pila.
Incluso si se pasa una referencia a un puntero,
void create_a_foo (Foo* &) {...}
entonces no es un equivalente. Todavía está en contra de código correcto, y realmente está asignando a un puntero, que no es lo mismo que inicializando un Foo.
Foo *p; // initialization of pointer is HERE, and nowhere else
create_a_foo(p); // creates a Foo and _assigns_ it to po.
Referencias-a-puntos son en el mejor de un hack si tiene la intención de un C# exacta out
clon, como si, por ejemplo, referencia-a-boost::optional
.
¿Desea simplemente anotar los parámetros de su función para indicar que el valor cambiará cuando la función regrese? ¿O está preguntando cómo invocar una función y pasar el parámetro por referencia (puntero) para que la función pueda cambiar persistentemente el valor que pasó la persona que llamó? – selbie
¿Qué quiere decir con "establecer un par de referencias a las variables"? Esto probablemente no se traduce muy bien de C# a C++. –
usted probablemente podría hacer una característica similar usted mismo con una clase de plantilla que podría permitirle escribir funciones como: void getValue (valor); y hazlo tirar si el valor no está establecido en la función. –
markh44