传值和传引用的区别

         大家都用过SqlHelper,在SqlHelper类中定义一些数据库助手函数:

通过分析某函数中调用“关闭连接”函数和“关闭cmd命令”函数后,是否可以关闭连接和cmd命令来分析传值和传引用的区别:

请注意看代码中被框注的部分

 

一,代码分析

代码1:

   

 

代码2:

 

 

代码3:

 

            分析:在ExecuteDataSet(参数)函数的最后调用CloseConn(ByVal conn As SqlConnection)和CloseCmd(ByVal cmd As SqlCommand),真的能 真正关闭连接和命令吗?

实验结果是:不能关闭。

   大家注意,以上CloseConn(ByVal conn As SqlConnection)函数和CloseCmd(ByVal cmd As SqlCommand)函数的参数传入方式是“传值”,也就是说传入的conn/cmd只是原对象的一个拷贝值(对它做任何改变都不会影响原值),而不是原对象(即,对象的内存地址),在ExecuteDataSet()函数中conn/cmd是被关闭了(也就是说,离开本次这个函数,conn/cmd还是可用/存在状态),但是程序继续调用其他函数或该函数conn/cmd依旧是可用的

 

如果想要将conn/cmd对象彻底关闭,则CloseConn()函数和CloseCmd()函数的参数传入方式应为“传引用”

 

代码3改编如下:

 

这样一来,问题又来了:代码1中定义的conn/cmd彻底被关闭了,程序执行如代码2中ExcuteDataSet()函数类似的函数(用到conn/cmd的)时,程序会报错,因为函数中用到的conn/cmd是不存在的。

怎么办?

答:代码1中创建conn/cmd的部分不要,直接在代码2中创建conn/cmd

 

代码1改编如下:

 

 

代码2改编如下:

 

 

二,总结

总结:传值与传引用的根本区别?

     传值:如果是非对象,会传一个值的拷贝,对这个变量做任何改动都不影响原值。

     传引用或者传对象:是传真实的内存地址,对这个变量做的改动会影响原值。

 

不知道以上的例子和解释,有没有把传值和传引用的区别讲清楚,很简单的一个东西,但是直到自己遇到问题了,去思考去解决了,才会有深的体会!!加油!!

 

<think>好的,用户想了解构造函数中引用区别及影响。首先,我需要回忆一下相关的C++知识,特别是关于参数构造函数的部分。根据提供的引用,特别是引用2引用3,引用在效率资源管理上有明显差异。 首先,调用构造函数时,参数会触发拷贝构造函数,生成临时对象。这会导致额外的构造析构开销,尤其是对于大型对象或深拷贝的情况,会消耗更多时间内存。而引用则避免了拷贝,直接操作原对象,效率更高。 接着,需要考虑是否修改原对象。如果使用const引用,可以防止函数内部意外修改参数,这在构造函数中很重要,因为通常不希望构造函数改变入的参数。引用5提到地址时使用const修饰符,类似地,const引用也能保护数据。 然后,资源管理方面,会创建副本,可能涉及深拷贝,如果类管理动态内存,深拷贝的正确实现很重要,否则可能导致问题。而引用则不需要处理这些,但需要确保参数的生命周期足够长,避免悬空引用。 还要注意拷贝构造函数本身不能使用参数,否则会导致无限递归,因为需要调用拷贝构造,而拷贝构造又需要,形成死循环。引用2中提到这一点,所以必须使用引用。 另外,内置类型STL迭代器等适合,因为它们设计为高效拷贝,而自定义类型更适合引用引用1引用2都强调了这一点。 最后,总结引用的主要区别在于效率、资源消耗、修改权限适用场景。需要结合具体使用情况来选择,通常构造函数参数推荐使用const引用来提升效率,除非参数是内置类型或设计为的对象。</think>### 构造函数中引用区别及影响 #### 1. **执行效率** - ****:调用构造函数时,参数会触发对象的拷贝构造函数,生成临时副本。对于自定义类型(如类或结构体),这会涉及深拷贝(尤其是包含动态内存时),导致额外的内存分配释放,时间空间消耗较高[^2][^3]。 $$ \text{成本} = \text{拷贝构造函数调用} + \text{析构函数调用} $$ - **引用**:直接递对象的地址,无需拷贝,避免了构造函数析构函数的调用,效率显著更高[^2][^3]。 #### 2. **对原对象的影响** - ****:操作的是参数的副本,对副本的任何修改不会影响原对象。 - **引用**: - 若使用**非 const 引用**,可以直接修改原对象。 - 若使用**const 引用**(推荐方式),既避免拷贝又保护原对象不被修改[^1][^5]。 #### 3. **资源管理** - ****:可能引发深拷贝问题。若类未正确实现拷贝构造函数,可能导致浅拷贝(如指针重复释放)[^2]。 - **引用**:无拷贝过程,无需处理资源重复分配或释放的问题。 #### 4. **适用场景** - **适用情况**: - 内置类型(如 `int`, `float`)。 - STL 迭代器、函数对象(设计时已保证拷贝高效)[^1]。 - **引用适用情况**: - 自定义类型(尤其是大型对象或深拷贝代价高的类)。 - 需避免拷贝的场景(如构造函数的参数递)[^2][^3]。 #### 5. **代码示例对比 ```cpp // :触发拷贝构造函数 class MyClass { public: MyClass(std::string str) : data(str) {} // ,str 是副本 private: std::string data; }; // 引用:避免拷贝 class MyClass { public: MyClass(const std::string& str) : data(str) {} // const 引用 private: std::string data; }; ``` #### 6. **特殊限制** - **拷贝构造函数必须引用**:若拷贝构造函数使用参数,会导致无限递归调用(需要调用拷贝构造,而拷贝构造又需要),因此语法强制要求拷贝构造函数的参数为引用[^2]。 --- ### 相关问题
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值