C++中普通引用传参的相关分析

C++中普通引用传参会发生的问题

C++中普通拷贝和引用作为函数参数时是有很大区别的,下面进行了相关的研究

下面的示例中,A为一个类,gg为一个形参为A&类型的函数。


参考代码

class A {
    public :
    int m;
    int n;
    int x;
    int y;
    public:
    A():m(1),n(1),x(1),y(1){}
    void foo(){cout<<"a"<<endl;}
    ~A(){m=0;cout<<"析构"<<endl;};
};
void gg(A& aa)
{
    cout<<"xixi"<<endl;
}
	A aa;
    gg(aa);
    cout<<aa.m<<endl;

运行结果

在这里插入图片描述

结果以及分析:

可以看到,上述的执行结果中只打印了一次"析构",且m值为1,那么我们可以得到一个结论,当某一个对象作为实参传给函数的形参且此时该形参为引用类型时,该引用变量离开函数作用域时是不会调用析构函数的。


总结和提升

引用相当于是给某一个变量起别名,那么当函数形参为引用类型时,某一个对象作为实参传入,当引用变量离开函数作用域时,此时该变量所对应的对象还是存在于外部作用域的,因此此时并不会调用析构函数。
若此时将引用改为普通变量(此例中为A类型)的话,此时函数结束时就会调用析构函数,因为此时传参的过程中会有一个拷贝的操作,相当于内存中会有两个对象。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C调用Python传参可以通过使用Python的C语言扩展API来实现。首先需要引入Python.h头文件,并且在C代码使用Py_Initialize()函数来初始化Python解释器。然后可以使用PyRun_SimpleString()函数来执行Python代码,通过该函数可以将Python代码作为字符串递给Python解释器执行。 在C代码调用Python传参的具体步骤如下: 1. 引入Python的C语言扩展API头文件,如Python.h。 2. 在C代码使用Py_Initialize()函数来初始化Python解释器。 3. 使用PyRun_SimpleString()函数来执行Python代码,将Python代码作为字符串递给该函数。 4. 在Python代码定义需要递的参数和相关操作。 5. 在C代码使用PyArg_ParseTuple()函数来解析Python递的参数,并将其转换为C语言的变量。 6. 在C代码进行必要的操作,并将结果返回给Python解释器。 7. 使用Py_Finalize()函数来结束Python解释器的使用。 例如,我们可以在C代码调用一个Python函数,该函数接受两个参数并返回它们的和: ```c #include <Python.h> int main(int argc, char *argv[]) { Py_Initialize(); // 初始化Python解释器 // 执行Python代码 PyRun_SimpleString("import my_module\n" "result = my_module.add(3, 5)\n" "print(result)"); // 解析Python递的参数 int sum; PyArg_ParseTuple(args, "i", &sum); // 在C进行必要的操作 int result = sum + 10; // 返回结果给Python解释器 PyObject *pyResult = Py_BuildValue("i", result); Py_Finalize(); // 结束Python解释器 return 0; } ``` 上述代码,我们通过PyRun_SimpleString函数执行了一段Python代码,该代码导入了一个名为my_module的模块,并调用了该模块的add函数来计算3和5的和。然后在C代码,我们使用PyArg_ParseTuple函数解析了Python递的参数,并将结果存储到sum变量。接着对sum进行了一定的操作,最后将结果通过Py_BuildValue函数转换为PyObject对象,并返回给Python解释器。 需要注意的是,在使用C调用Python传参时,需要明确了解Python的C语言扩展API的使用方法,并根据具体需求进行相应的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值