有关C++函数传值的问题

Iamfreak 2018-08-07 02:35:11
假如我函数传了一个一个对象,而非对象引用,按照书上说法是,传值的时候,是先将实参传给一个temp对象,再将temp赋值给形参,这难道不是调用了两次赋值构造函数吗,为什么自己试了一下,好像只调用了一次?因为我在析构函数里减一,但没在赋值构造函数里加一,运行了一次程序,发现类的静态变量仅仅为-1;
...全文
300 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
张天星 2018-08-22
  • 打赏
  • 举报
回复
引用 13 楼 Iamfreak 的回复:
[quote=引用 11 楼 qq_17523135 的回复:]
先将实参传给一个temp对象,再将temp赋值给形参
这句话是有问题的。
形参本身就是一个局部变量,实参是直接传递给形参的,没有什么temp临时对象的说法。
只是形参的生命周期,只在这个方法之内,方法结束了,形参也销毁了。

大佬你看一下这段文字的倒数第二句话,感觉和你说的不是一个意思啊,我就一直在为这个东西纠结,为什么按值转递参数的时候会用到一个临时变量呢?函数返回用到我能理解。[/quote]
一个意思,这里说的临时副本,就是仅在方法内生效的形参。
传入的时候,按值传递,传递给了形参,在这段话中,临时副本指的就是形参。
而返回的时候,临时副本返回这句话,指的也是方法内部的变量,这个变量可能是方法内部定义的,可能是形参,但都是仅在这个方法内部有效,也可以说成是临时副本。
这只是说法上的区别。
但是没有 先将实参传给一个temp对象,再将temp赋值给形参这个过程,在这里,temp和形参是同一个东西。
Iamfreak 2018-08-15
  • 打赏
  • 举报
回复
引用 11 楼 qq_17523135 的回复:
先将实参传给一个temp对象,再将temp赋值给形参
这句话是有问题的。
形参本身就是一个局部变量,实参是直接传递给形参的,没有什么temp临时对象的说法。
只是形参的生命周期,只在这个方法之内,方法结束了,形参也销毁了。

大佬你看一下这段文字的倒数第二句话,感觉和你说的不是一个意思啊,我就一直在为这个东西纠结,为什么按值转递参数的时候会用到一个临时变量呢?函数返回用到我能理解。
张天星 2018-08-12
  • 打赏
  • 举报
回复
引用 7 楼 Iamfreak 的回复:
[quote=引用 4 楼 hou09tian 的回复:]
形参就可以看成是temp,所以就只调用一次构造函数了

我也打算这样理解的。我有一个疑问,就是不管我的实参是 typename &a,还是typename a,传给形参typename &b的过程就是
typename &b=a;这样是传的引用而非值,请问这条语句,为什么不会调用赋值构造函数呢?这种引用的初始化,难道是调用了默认构造函数生成了对象b,然后通过b=a进行‘=’重载的操作过程吗?望指导[/quote]
如果形参是typename &b,那么实参传递进来的时候,传递的仅仅是地址,b和a本身是不同的指针,指向了同一个变量(对象)。变量本身只有一个,那就是&a或者a.并没有再新建一个的操作,自然不会触发构造函数。
你可以设置断点,查看两个变量传进传出的时候,他们的地址,来回查看,应该可以找到规律。
张天星 2018-08-12
  • 打赏
  • 举报
回复
先将实参传给一个temp对象,再将temp赋值给形参
这句话是有问题的。
形参本身就是一个局部变量,实参是直接传递给形参的,没有什么temp临时对象的说法。
只是形参的生命周期,只在这个方法之内,方法结束了,形参也销毁了。
AlbertS 2018-08-10
  • 打赏
  • 举报
回复
引用 7 楼 Iamfreak 的回复:
[quote=引用 4 楼 hou09tian 的回复:]
形参就可以看成是temp,所以就只调用一次构造函数了

我也打算这样理解的。我有一个疑问,就是不管我的实参是 typename &a,还是typename a,传给形参typename &b的过程就是
typename &b=a;这样是传的引用而非值,请问这条语句,为什么不会调用赋值构造函数呢?这种引用的初始化,难道是调用了默认构造函数生成了对象b,然后通过b=a进行‘=’重载的操作过程吗?望指导[/quote]
typename &b=a 不需要调用构造函数,只是给啊起了一个别名b
Iamfreak 2018-08-10
  • 打赏
  • 举报
回复
引用 8 楼 hou09tian 的回复:
[quote=引用 7 楼 Iamfreak 的回复:]
[quote=引用 4 楼 hou09tian 的回复:]
形参就可以看成是temp,所以就只调用一次构造函数了

我也打算这样理解的。我有一个疑问,就是不管我的实参是 typename &a,还是typename a,传给形参typename &b的过程就是
typename &b=a;这样是传的引用而非值,请问这条语句,为什么不会调用赋值构造函数呢?这种引用的初始化,难道是调用了默认构造函数生成了对象b,然后通过b=a进行‘=’重载的操作过程吗?望指导[/quote]
指导不敢当,互相学习哈

为引用类型赋初值,只是绑定,而不是拷贝。所以不会调用拷贝构造函数,当然更不会使用重载的=操作符[/quote]
绑定的话。。。那我能这么理解吗?就是b只是a的一个别名,实际上虽然我可以对b进行对a进行的各种操作,看起来好像是对b进行这些操作,但实际上,在编译器中,对b的操作都会直接转换为对a的操作,就像define和const定义常量一样。仅仅是个名字罢了。可是这样理解的话,引用名前为什么要加类型呢,就像int a=2;int &b=a;好像这个&前面的int变得多余了,因为引用总是和被引用对象同类型。可是又有int a=2;const double &b=a;这种用法,这时候b就不是和a同类型了。那此刻b好像又拥有了自己的内在,而非依附于a。我知道其实此刻b绑定的是一个const double 类型的临时变量,可是既然已经规定了引用初始化的时候两端必须类型统一,为什么又要允许常引用的类型转换功能,而且这转换貌似看起来没什么用。b不是指向a的,自身也不能改变了,只能读取。
棉猴 2018-08-10
  • 打赏
  • 举报
回复
引用 7 楼 Iamfreak 的回复:
[quote=引用 4 楼 hou09tian 的回复:]
形参就可以看成是temp,所以就只调用一次构造函数了

我也打算这样理解的。我有一个疑问,就是不管我的实参是 typename &a,还是typename a,传给形参typename &b的过程就是
typename &b=a;这样是传的引用而非值,请问这条语句,为什么不会调用赋值构造函数呢?这种引用的初始化,难道是调用了默认构造函数生成了对象b,然后通过b=a进行‘=’重载的操作过程吗?望指导[/quote]
指导不敢当,互相学习哈

为引用类型赋初值,只是绑定,而不是拷贝。所以不会调用拷贝构造函数,当然更不会使用重载的=操作符
Iamfreak 2018-08-09
  • 打赏
  • 举报
回复
引用 4 楼 hou09tian 的回复:
形参就可以看成是temp,所以就只调用一次构造函数了

我也打算这样理解的。我有一个疑问,就是不管我的实参是 typename &a,还是typename a,传给形参typename &b的过程就是
typename &b=a;这样是传的引用而非值,请问这条语句,为什么不会调用赋值构造函数呢?这种引用的初始化,难道是调用了默认构造函数生成了对象b,然后通过b=a进行‘=’重载的操作过程吗?望指导
Iamfreak 2018-08-09
  • 打赏
  • 举报
回复
引用 3 楼 zhouchongzxc 的回复:
你看的是哪本书

或许你该换一本

C++primer plus。正确的理解应该是什么,你说一下吧,我最近很纠结这个问题。
棉猴 2018-08-08
  • 打赏
  • 举报
回复
形参就可以看成是temp,所以就只调用一次构造函数了
LiberFurther 2018-08-08
  • 打赏
  • 举报
回复
我的书告诉我按值传递就是实参将值直接拷贝给形参。 不过我听说老一些的编译器可能会多一个步骤,就是实参拷贝给形参的中间还要经过一个临时变量。
ChongQingJin28 2018-08-07
  • 打赏
  • 举报
回复
你看的是哪本书

或许你该换一本
weixin_42904142 2018-08-07
  • 打赏
  • 举报
回复
这就相当于将实参数据,拷贝到形参的这块内存上.所以只调用了一次
Iamfreak 2018-08-07
  • 打赏
  • 举报
回复
我发现其实按我这么理解的话,即便是传引用也要调用一次构造函数的,因为实参传给形参就是执行const typename & a=typename b;嘛。难道执行引用语句的时候不需要为a来调用赋值构造函数吗

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧