注册 登录
编程论坛 C++教室

关于“引用”在内使用上的问题

gujunpu 发布于 2013-03-12 17:25, 677 次点击
在网上读到这样一句话:
使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的 副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比 用一般变量传递参数的效率和所占空间都好。
——————————————————————————————————分割线——————————————————————————————————
我想问一下这句话“如果传递的是对象,还将调用拷贝构造函数。”,对象不是引用型变量吗(java中的概念,C++应该是一样吧),那最多在栈内生成一个实例首地址的局部变量,为什么还要调用拷贝构造函数,直接指向不就行了吗?还是说java和C++有差异?
4 回复
#2
gujunpu2013-03-12 17:33
以下是引用gujunpu在2013-3-12 17:25:59的发言:

在网上读到这样一句话:
使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的 副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比 用一般变量传递参数的效率和所占空间都好。
——————————————————————————————————分割线——————————————————————————————————
我想问一下这句话“如果传递的是对象,还将调用拷贝构造函数。”,对象不是引用型变量吗(java中的概念,C++应该是一样吧),那最多在栈内生成一个实例首地址的局部变量,为什么还要调用拷贝构造函数,直接指向不就行了吗?还是说java和C++有差异?

可能是我文字上没有理解清楚,原文的意思是不是“只要传递对象,就要使用拷贝构造函数”?
#3
peach54602013-03-13 08:28
这个涉及到实参和形参的概念咯
你在二楼说得很对,是jave和c++的区别...
c#也和java一样
#4
ap08053192013-03-13 10:07
引用是被引用对象的一个别名,因此对引用的操作就如同对被引用对象的操作一样,会改变被引用对象的值,如果直接用实参传值给形参,则将在栈内建立一个实参对象的副本,当函数返回时,栈内的实参对象的副本也会被撤消,其实无论是什么类型的参数都是当作对象看待,因此当被传递的是类对象时,也会在栈内创建一个类对象的副本,注意,那句话的意思是调用“拷贝构造函数”,“拷贝构造函数”是一个函数,而不又调用又拷贝,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。
#5
gujunpu2013-03-22 21:31
回复 4楼 ap0805319
谢谢,那如果在定义函数的时候,声明的形参就是引用,就不建立副本了吧,如Initialize(&g)。
还有那句“其实无论是什么类型的参数都是当作对象看待”不是很明白,是都传一个地址过来吗?
1