Cuando cambio un parámetro dentro de una función, ¿cambia para la persona que llama también?

He escrito una función a continuación:

void trans(double x,double y,double theta,double m,double n) { m=cos(theta)*x+sin(theta)*y; n=-sin(theta)*x+cos(theta)*y; } 

Si los llamo en el mismo archivo por

 trans(center_x,center_y,angle,xc,yc); 

¿cambiará el valor de xc y yc ? Si no, ¿qué debería hacer?

Como está usando C ++, si quiere que xc y yc cambien, puede usar referencias:

 void trans(double x, double y, double theta, double& m, double& n) { m=cos(theta)*x+sin(theta)*y; n=-sin(theta)*x+cos(theta)*y; } int main() { // ... // no special decoration required for xc and yc when using references trans(center_x, center_y, angle, xc, yc); // ... } 

Mientras que si estuvieras usando C, tendrías que pasar punteros o direcciones explícitos, tales como:

 void trans(double x, double y, double theta, double* m, double* n) { *m=cos(theta)*x+sin(theta)*y; *n=-sin(theta)*x+cos(theta)*y; } int main() { /* ... */ /* have to use an ampersand to explicitly pass address */ trans(center_x, center_y, angle, &xc, &yc); /* ... */ } 

Recomiendo consultar la entrada de C ++ FAQ Lite en las referencias para obtener más información sobre cómo usar las referencias correctamente.

Pasar por referencia es sin duda una respuesta correcta; sin embargo, el tipo de C ++ permite retornos de múltiples valores usando std::tuple y (para dos valores) std::pair :

 #include  #include  using std::cos; using std::sin; using std::make_tuple; using std::tuple; tuple trans(double x, double y, double theta) { double m = cos(theta)*x + sin(theta)*y; double n = -sin(theta)*x + cos(theta)*y; return make_tuple(m, n); } 

De esta forma, no tiene que usar parámetros de salida en absoluto.

En el lado de la persona que llama, puede usar std::tie para descomprimir la tupla en otras variables:

 using std::tie; double xc, yc; tie(xc, yc) = trans(1, 1, M_PI); // Use xc and yc from here on 

¡Espero que esto ayude!

Necesita pasar sus variables por referencia lo que significa

 void trans(double x,double y,double theta,double &m,double &n) { ... } 

como se dijo anteriormente, debe pasar por referencia para devolver los valores alterados de ‘m’ y ‘n’, pero … considere pasar todo por referencia y usar const para los parámetros que no quiere que se alteren dentro de su función, es decir

 void trans(const double& x, const double& y,const double& theta, double& m,double& n)