2011-09-30 19 views
5

¿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.

+0

¿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

+0

¿Qué quiere decir con "establecer un par de referencias a las variables"? Esto probablemente no se traduce muy bien de C# a C++. –

+0

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

Respuesta

9

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; 
+0

¡Maldición! ¡Necesito acelerar! +1 – Phil

+0

(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) –

+0

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'). –

0

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.

+0

punteros no son el equivalente. con C# 'out', usted _inicializa_ ese parámetro en alguna función. –

3

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.