【问题标题】:Changing values of class instances in a function [duplicate]在函数中更改类实例的值[重复]
【发布时间】:2017-11-15 18:35:12
【问题描述】:

我编写了以下代码来测试如何在函数中更改类对象的值。

using namespace std;

class test{
public:
    int a;
};

void runer(test testXX){
    testXX.a=10;
}

int main()
{
    test test1;
    test1.a=5;
    runer(test1);
    cout<<test1.a;
    return 0;
}

当我运行以下代码时,输​​出是 5 而不是 10。是因为我无法更改类实例的值,就像我无法在不使用指针的情况下更改数组成员的值一样?如果有人能澄清这一点,我将不胜感激!

【问题讨论】:

  • 你的意思可能是void runer(test&amp; testXX)

标签: c++ oop


【解决方案1】:
void runer(test testXX){
    testXX.a=10;
}

获取test 类型的完整副本,因此在函数中对其进行了修改,但与 main 中的实例不同。

C++ 中的参数是按值发送的。最简单的例子是

 int function( int value ) {
      for( ; value > 0 ; value-- ){
          cout << "Hello\n";
      }
 } 

 int main( int , char ** ){
       int value = 10;
        function( value ); // display 10 things
        function( value ); // display 10 things again (not modified).
        function( 5 );  // also not making sense, if parameter is modified.
 }

为了允许修改对象,它们需要作为引用或指针发送。这允许更改项目的值。无法将文字 5 发送到需要引用的函数。

void runer(test & testXX){
    testXX.a=10;
}

现在同一个对象从 main 发送到 runner,并对单个对象进行了修改。

【讨论】:

  • 感谢您的帮助,现在一切都说得通了!
【解决方案2】:

您将参数按值传递给函数,因此它会获得一个本地副本,该副本仅与函数的作用域一样长。

如果您希望函数能够修改您传入的原始对象,则通过非常量引用 void runer(test&amp; testXX) 传递它。

【讨论】:

    【解决方案3】:

    您的代码按值进行调用。因此,更改不会出现在实际对象中。要更改对象的属性值,您需要通过引用进行调用。

    void runer(test &t){
        t.a = 10;
    }
    

    【讨论】:

      猜你喜欢
      • 2023-01-08
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多