征集对C++中传值的理解,高手请进!!!

FishCrazy 2002-08-04 03:38:14
征集对C++中传值的理解…………
...全文
41 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
eastxing 2002-08-04
  • 打赏
  • 举报
回复
我觉得之所以会产生疑问,是因为对函数编译后形成的汇编代码没有理解。

Intel的CPU在堆栈中传递多数的参数,函数经过编译后形成了固定的操作序列,一般是函数参数压栈,返回地址压栈,堆栈框架压栈,函数内局部变量压栈……也就是堆栈中分配多少字节,做什么用,都是在编译的时候已经决定下来的了。执行时,若需要一个基类对象,但传递了一个派生类对象(通常是要比基类对象大的),就会发生对象的切割。因为如果不这样,函数参数就会占用其他用途的堆栈空间,结果是可想而知了。但若参数是引用或指针就没有这样的问题,因为不管是引用(指向)基类还是派生类对象,其所占的大小都是4字节(Win32平台)。
hucong 2002-08-04
  • 打赏
  • 举报
回复
看一下,函数调用的汇编代码,再清楚不过了,呵呵
julyclyde 2002-08-04
  • 打赏
  • 举报
回复
我认为发生切割是很合理的。本来嘛,你就不需要派生类多出来的那一块东西
rivershan 2002-08-04
  • 打赏
  • 举报
回复
关于传值与传址及引用:
传值是在被调用函数所在区域做一个被传参数的拷贝,既然是拷贝了被传参数,那么在函数中对形参的改变不会影响到被传参数.也就是说函数的参数不具备返回值的能力.
传值调用.把实参的右值(即内容,不可被赋值)传递进来,所以函数内部改变形参不会影响实参.

如:
void Fun(int a)
当你调用并传值时,这个a的值其实就是copy出来了一份啦!在函数里的操作已经不关argument(实参)的事啦!函数里的操作只对copy出来的那一份有作用!当函数结束时,copy出来的那一分东东也就不存在啦!

传址是指传送的对象为指针或引用,再传递时被调函数得到的是被传数据的地址,在被调函数中对原被传数据的地址直接进行操作将影响到实参的值,实参的值有可能被改变.
传址调用。把实参的左值(即地址,可被赋值)传递进来,所以函数对形参的改变,相当于直接修改了实参地址里的内容。c中没有引用,传址功能可以实现c++中的引用。



下列程序显示了引用参数与非引用参数之间的差别:
void FuncA(int& Param) //reference parameter
{
++Param;
}
void FuncB(int Param) //nonreference parameter
{
++Param;
}
void main(void)
{
int N=0;
FuncA(N); //N passed by reference
//here,N equals 1
FuncB(N); //N passed by value
//here,N still equals 1
}


希望能对你有些帮助~
earthharp 2002-08-04
  • 打赏
  • 举报
回复
all pass by value
kwok_1980 2002-08-04
  • 打赏
  • 举报
回复
对呀!的确被sliced off
当为基类声明一个实际对象时,同时也就配置出足以容纳该
实际对象的内存空间。如果稍后传入的却是一个派生类对象,那就没有足够的内存
空间存放派生类中的各个数据成员
shuidingding0518 2002-08-04
  • 打赏
  • 举报
回复
呵呵,都这么明白了还问什么呀
lwplwp123 2002-08-04
  • 打赏
  • 举报
回复
強烈關注中。。。。。。。。。。。。。
wangran 2002-08-04
  • 打赏
  • 举报
回复
这两天看《Effective C++》,其中对传值有这样的用法:
class Base
{
...
};
class Derived:public Base
{
...
};
void func(Base b);
如果你有这样一个对象:
Derived d;
func(d);
那么传给函数func的参数就会发生切割现象,把对象d中不属于基类的部分切掉,也就是说传进去是一个Base类的对象。如果你想传进去一个Derived的对象,只能用pass_by_reference的方法:
void func(Base & b);

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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