在函数外部声明对象,将其作为引用传递,然后在函数内部创建它

Declare object outside function, pass it as reference and then create it inside function

本文关键字:函数 然后 内部 创建 引用 声明 外部 对象      更新时间:2023-10-16

首先我将尝试解释我想做什么,然后解释我正在试验的行为

我有一个main.cpp文件,我有一些对象,例如x、y、z。我想在main.cpp中定义这些对象,并将它们传递给一个函数来初始化它们,最后使用它们。

这是我的代码的一部分

int main(){
    X* x = NULL;
    Y* y = NULL;
    Z* z = NULL;
    function(x,y,z);
    x->getX();
    return 0;
}
void function (X* x, Y* y, Z* z){
    x = new X();
    y = new Y();
    z = new Z();
}

此代码导致x->getX();中出现分段故障。我用gdb运行程序,对象在function()中正确创建,但当从function退出执行时,对象被销毁,x=y=z=0x0。

我认为,当您通过引用将对象传递给函数时,您可以修改对象的成员,但不能修改对象本身。

所以,我的问题是如何在main中声明一个对象,然后将其传递给一个函数进行初始化,最后在main中使用它。

谢谢。

您需要通过引用传递。当前您正在传递值,该值将创建您的值的副本。这里有一个简单的例子,考虑2个函数:

void dontEdit(int a) {
   a = 2;
}
void edit(int &a) {
   a = 2;
}

dontEdit中,a将被复制,更改a的值对外部世界没有影响。在edit中,您为函数提供了一个引用到保存a的内存,因此您可以在函数范围之外检测到此更改。在这里考虑它们的用途:

int main() {
    int a = 5;
    cout << "a is: " << a << endl;
    dontEdit(a); // this is pass by value, a copy of a is made.
    cout << "a is: " << a << endl;
    edit(a); // this is pass by reference, a is edited directly. 
    cout << "a is: " << a << endl;
    return 0;
}

输出为:

a is: 5
a is: 5
a is: 2

实例

在你的问题中,你也有同样的问题。您想要编辑main作用域x,但是您按值传递它。您将创建指针x的副本,并将其分配给new X()。然后当你返回时,x的副本不再存在,你创建的内存也挂着,你没有办法找到它。所以你需要做什么通过引用

void function (X* &x, Y* &y, Z* &z) {

最后要注意的是,c++没有自动垃圾收集,因此对于每个new都应该有一个delete,否则将面临memory leaks的风险。

您的函数应该声明为

void function (X* &x, Y* &y, Z* &z)

因为您希望将参数作为引用传递,以便能够修改指针x、y和z。

X*表示指向X 的指针

&表示。。。

因此

X* &x表示指向X 的指针的引用

查看以下问题以了解更多详细信息,其中包含您需要了解的基本信息:

如何在C++中将对象传递给函数?

我认为你应该使用,IMHO这个真正好的属性,通过引用传递。但是,如果要通过引用使用间接传递,则被调用者中的实际参数应以&作为function(&x,&y,&z);在前。但这对C++来说并不好。因为它具有实传参考功率。我错了吗?

相关文章: