c++通过引用传递问题

c++ pass by reference issue

本文关键字:问题 引用 c++      更新时间:2023-10-16

如何将对集合的引用传递给另一个类以使该类修改它?尝试直观的方式(即传递和存储引用collection& c,然后使用该引用进行更新)似乎不起作用:

#include <iostream>
#include <vector>
class Test{
private:
    std::vector<int> testvec;
public:
    Test(std::vector<int>& vec){
        testvec = vec;
    }
    void add(int i){
        testvec.push_back(i);
    }
    void report(){
        std::cout << "testvec has " << testvec.size() << " items" << "n";
        for(int i : testvec)
            std::cout << i << " ";
        if(!testvec.empty())
            std::cout << "n";
    }
};
int main() {
    std::vector<int> myVec;
    Test test(myVec);
    for(int i = 0; i < 10; i++){
        test.add(i);
    }
    test.report();
    std::cout << "n";
    std::cout << "myVec has " << myVec.size() << " items" << "n";
    for(int i : myVec)
        std::cout << i << " ";
    return 0;
}

会给我

testvec有10个条目

0 1 2 3 4 5 6 7 8 9

myVec有0项

当您创建Test对象时,您通过引用传递myVec,但testvec实际上是一个值。所以它会复制myVec在那个时候的值,这是一个空向量。把

std::vector<int> testvec;

std::vector<int>& testvec;

,它会工作。但是你还需要调整构造函数:

Test(std::vector<int>& myVec) : testvec(myVec) {}

注释说明:

由于成员testvec现在是一个引用,因此它必须指向内存中存在的某个对象。

必须在构造Test类的实例时初始化,否则testvec不是有效的引用类型,程序将是病态的。

初始化列表在构造函数体之前触发。它也是为所有成员分配默认值或指定值的地方。对于引用,唯一有效的值是内存中的现有对象(或引用),因此必须显式地告诉引用成员他们必须初始化的值。

class A {
    int& t;
    A(int& T) : t(T) {} // * OK
    A(int& T) { t = T; } // ** ill-formed
}

(*)是可以的,因为在调用构造函数body

之前,t是用T设置的

(**)不可以,因为t是在初始化列表之后设置的,所以在设置默认值的步骤之后。

它不起作用,因为您使用的是按值传递而不是按引用传递。要在c++中使用引用传递,您的实际参数应该像Test test(& myVec);,而在函数的接收端,它的参数应该像Test(std::vector<int>* vec)(在您的情况下,它是构造函数)。总是通过引用传递,必须发送变量的地址,而通过值传递,必须发送变量的实际值。

你应该直接使用

std::vector<int> *testvec;

您要发送的地址为"myVec"

Test test(& myVec);

和构造函数应该像

Test(std::vector<int>* vec) {
    testvec = vec;  
}

的休息
testvec.properties(); 

必须使用

testvec->properties();

那么它肯定会工作。

解决方案链接:http://ideone.com/7DWJ9O