C ++通过引用在类中传递函数

时间:2018-08-08 00:48:19

标签: c++ class pass-by-reference

我试图将对函数的引用传递给类,但在弄清楚如何做到这一点时遇到了麻烦。假设我有一个这样定义的类test

#include <iostream>

class test {
public:
  test () {};
  ~test () {};

  void setA (int);
  int getA (void);

private:
  int a;

};

void test::setA (int A) { a = A; }

int test::getA (void) { return a; }

using namespace std;

int main ()
{
  test T;
  T.setA(5);

  cout << "a = " << T.getA() << endl;

  return 0;
}

那很好,但是如果我想通过引用传递值

#include <iostream>

class test {
public:
  test () {};
  ~test () {};

  void setA (int);
  int & getA (void);

private:
  int a;

};

void test::setA (int & A) { a = A; }

int & test::getA (void) { return a; }

using namespace std;

int main ()
{
  test T;
  T.setA(5);

  cout << "a = " << T.getA() << endl;

  return 0;
}

我不知道如何配置setA以通过引用传递。

2 个答案:

答案 0 :(得分:1)

代码有两个问题。首先,setA的定义与声明不匹配。您必须使声明以引用作为参数。

更改此:

void setA (int);

对此:

void setA (int&);

第二个问题是您试图传递一个r值(5)作为参考。您必须传递一个L值。您可以通过先创建一个int然后通过引用传递它来实现:

int i = 5;
T.setA(i);

完整示例:

#include <iostream>

class test {
public:
  test () {};
  ~test () {};

  void setA (int&);
  int & getA (void);

private:
  int a;

};

void test::setA (int & A) { a = A; }

int & test::getA (void) { return a; }

using namespace std;

int main ()
{
  test T;

  int i = 5;


  T.setA(i);

  cout << "a = " << T.getA() << endl;

  return 0;
}

当您通过引用传递某些东西给C ++中的函数时,该函数不会自动将参数保留在内存中。因此,您必须先声明它,以便它在整个函数中都保留在内存中。

您尝试作为参考传递的5将超出范围,并在函数启动后立即销毁。相反,在主函数的末尾销毁了声明的i变量。

答案 1 :(得分:0)

也许您可以尝试以下方法:

#include <iostream>

class test {
public:
    test() {};
    ~test() {};

    void setA(int&&); // requires at least C++11
    void setA(int&);
    int & getA(void);

private:
    int a;

};

void test::setA(int && A) { a = A; }
void test::setA(int&A) { a = A; }
int & test::getA(void) { return a; }

using namespace std;

int main()
{
    test T;

    int i = 5;


    T.setA(i);

    cout << "a = " << T.getA() << endl;

    T.setA(8);

    cout << "a = " << T.getA() << endl;

    return 0;
}

在示例中,int&传递了一个l值,而int&&传递了一个r值作为参考。