c++ 当我在一个函数中改变一个参数时,它是否也会为调用者改变?[副本]

af7jpaap  于 2023-05-02  发布在  其他
关注(0)|答案(4)|浏览(458)

此问题已在此处有答案

What's the difference between passing by reference vs. passing by value?(18回答)
Pass by reference and value in C++(5个答案)
5天前关闭。
我在下面写了一个函数:

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;
}

如果我在同一个文件中调用它们

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

xcyc的值会改变吗?如果没有,我该怎么办?

rta7y2nd

rta7y2nd1#

由于你使用的是C++,如果你想改变xcyc,你可以使用引用:

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);
    // ...
}

然而,如果你使用C,你必须传递显式的指针或地址,例如:

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);
    /* ... */
}

我建议您查看C++ FAQ Lite's entry on references以获取更多关于如何正确使用引用的信息。

yxyvkwin

yxyvkwin2#

通过引用传递确实是一个正确的答案,但是,C++ sort-of允许使用std::tuple和(对于两个值)std::pair返回多值:

#include <cmath>
#include <tuple>

using std::cos; using std::sin;
using std::make_tuple; using std::tuple;

tuple<double, double> 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);
}

这样,你根本不需要使用out-parameters。
在调用者端,可以使用std::tie将元组解压缩到其他变量中:

using std::tie;

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

希望这有帮助!

wwtsj6pe

wwtsj6pe3#

你需要通过引用传递变量,这意味着

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

ifmq2ha24#

如上所述,您需要通过引用传递以返回'm'和'n'的更改值,但是。..考虑通过引用传递所有内容,并使用const作为您不希望在函数i中更改的参数。e.

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

相关问题