簡體   English   中英

C ++通過引用傳遞類中的函數

[英]C++ pass a function in a class 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以通過引用傳遞。

代碼有兩個問題。 首先,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變量在main函數的末尾被銷毀。

原因是因為為了通過引用傳遞,你必須有一個左值 ,這是一種奇特的方式,可以說一些持續超出一次使用的東西。

如果您創建了一個int變量,則可以通過引用傳入它。 在上面的代碼中,您嘗試傳入一個原始整數值(5),該值失敗,因為編譯器期望引用int,而不是原始整數值。

以下代碼可以工作:

int main ()
{
  test T;
  int myVariable = 4; // Need an actual variable to pass by reference.
  T.setA(myVariable);

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

  return 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值作為引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM