【问题标题】:please help me clarify C++ pass by value?请帮我澄清 C++ 按值传递?
【发布时间】:2021-01-29 17:45:25
【问题描述】:
struct rec {
    int length;
    int breath;
};

int area(rec objrec1) {
    objrec1.length ++;
    //objrec1.breath;
    //int result= objrec1.length++ * objrec1.breath;
    return(objrec1.length++ * objrec1.breath);
    //return(result);
}

int main() {
    rec objrec = { 10,5 }; // create object to access struct
    int arearesult;
    arearesult = area(objrec); // we pass the whole struct into the parameter
    cout << arearesult << endl;
}

我的问题是,如果实际参数没有对形式参数进行更改,那么返回主“arearesult”时长度(++)的增量如何影响结果,使答案为 55 而不是 50。因为我在想,如果我将长度增加 1 使其变为 11,但是当它到达 main() 时,它将变为无效并返回 10,因为实际参数和形式参数中的长度不一样。谢谢

【问题讨论】:

  • 你通过值传递objrec 并将返回值分配给areresult 并打印它的值,这是两个不同的变量/对象
  • 但是objrec 不会改变值。
  • 目前还不清楚你认为会变成“无效”和“回头”的“它”是什么。函数正在修改参数,但参数是objrec 的副本。它的工作原理与您直接传递int 完全相同。
  • 您可能想投资一个好的C++ Book。它涵盖了这方面以及该语言的许多其他方面。

标签: c++ function struct pass-by-reference pass-by-value


【解决方案1】:

我在想,如果我将长度增加 1 使其变为 11,但当它到达 main() 时,它将变为无效并返回 10

没有单个变量length。你有两个独立的对象,每个对象都有自己独立的length

我们可以将您的电话改写为

int main() {
    rec objrec = { 10,5 }; // create object to access struct
    int arearesult;

    // manually inline this call:
    // arearesult = area(objrec); // we pass the whole struct into the parameter
    // int area(rec objrec1)
    {
        rec objrec1 = objrec;

        objrec1.length ++;

        arearesult = objrec1.length++ * objrec1.breath;

    } // objrec1 ceases existing here, objrec is unaffected

    cout << arearesult << endl;
}

你可以看到objrec在调用范围内根本没有被触及,除了初始化objrec1。更改objrec1.length 不会影响objrec.length

【讨论】:

    【解决方案2】:

    您的问题可以归结为:

    #include <iostream>
    
    int foo ( int x ) { 
        x = 42;
        return x; 
    }
    
    int main {
        int a = 1;
        int b = 2;
        a = foo( b );
        std::cout << a << ' ' << b;
    }
    

    b 是按值传递的。调用foo 不会修改它,因为foo 修改了b 的副本。 a 没有传递给函数,而是获取分配的返回值。之后它的值与以前不同。

    main中a的值是42,因为这是foo返回的值。在foo 返回后,ab 之间没有神奇的隐藏依赖关系。

    【讨论】:

    • x = 42; return x 可能更清楚,因为 OP 似乎认为说return x 意味着结果将“跟踪”x,这样它就会在foo() 之外恢复为2。 .. 什么的。
    猜你喜欢
    • 2016-04-22
    • 2016-02-29
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 2012-07-29
    • 2013-05-27
    相关资源
    最近更新 更多