社区
C语言
帖子详情
征集对C++中传值的理解,高手请进!!!
FishCrazy
2002-08-04 03:38:14
征集对C++中传值的理解…………
...全文
41
9
打赏
收藏
征集对C++中传值的理解,高手请进!!!
征集对C++中传值的理解…………
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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);
C++
之父领衔,2024 全球
C++
及系统软件大会正式官宣!
在当下的技术浪潮
中
,AI 与大模型无疑是科技领域的主角,但
C++
和系统软件并未因此被边缘化,反而迎来了全新的发展机遇。面对 AI 和大模型对计算性能与系统稳定性的严苛要求,
C++
作为高效、强大的编程语言,在底层系统开发与性能优化
中
的地位日益重要。而系统软件作为支撑科技生态的基石,也在快速迭代与创新
中
应对挑战,以适应飞速变化的技术需求。在这样的背景之下,2024 全球
C++
及系统软件技术大...
【C/
C++
解惑篇】*,**,:: ,&,*&,**&和函数传参-七者详解
【C/
C++
指针解惑】*,**和&三者详解前言1. C/
C++
中
* 的用法2. C/
C++
中
& 的用法3. 函数的参数3.1 函数传入普通参数3.2 函数传入指针参数3.3 引用传入函数参数4. C/
C++
中
:: 的用法5. C/
C++
中
** 的用法6. C/
C++
中
*&,**& 的用法 前言 最近指针还是容易迷,重新整理学习一下! C语言之所以要起名为“C”,是取的“BCPL”的第二个字母(第一个字母用来命名之前被发明的B语言) 。当C语言发展到顶峰的时刻,出现
C++
20:方向之争
C++
20 特性 模块 协程 无栈协程 编译期 计算支持 静态反射 模式匹配
C++
20作为
C++
语言的一个新标准,带来了许多新的特性和改进,同时也引发了一些关于发展方向的争议。这些争议主要集
中
在如何平衡语言的复杂性、性能、易用性以及与其他编程语言和技术的集成等方面。首先,
C++
20引入了一些新的语言特性和库,如concepts(概念)、ranges(范围)、coroutines(协程)等,这些特性旨在提高代码的可读性、可维护性和性能。然而,这些新特性的引入也增加了语言的复杂性,使得学习和掌握
C++
变得更加困难。
微信公众号如何嵌入照片
征集
视频
征集
小程序
很多公众号运营者,经常在组织照片
征集
/视频
征集
活动的时候,会借助
征集
工具【Fotoo
征集
一下】小程序; 那怎么能将【fotoo
征集
一下】小程序嵌入到公众号文章或者公众号导航栏呢,今天就带大家一起操作一下: 一、走进照片视频
征集
工具 【Fotoo
征集
一下】 小程序,是一款方便活动组织者做
征集
投稿、收集投稿的小程序,支持照片
征集
、视频
征集
、文字
征集
、素材
征集
、音频
征集
等,可以在线征稿、投稿,批量管理投稿,在线评选,点赞投票; 二、访问【fotoo
征集
一...
全网
征集
对六如偈的
理解
:一切有为法,如梦幻泡影,如露亦如电,应作如是观
全网
征集
对六如偈的
理解
:一切有为法,如梦幻泡影,如露亦如电,应作如是观金刚经看得不是很明白。。呵呵。 看到这六句话,想听听百家之言。。 下面给出自己的解释 ^_^法: 就是指特性,规则,规律,这是指虚的,也可以指实的,如人,兽,树木(可能就是因为他们特征不一样吧)。 也可以合起来指的,如:他很好色!!! 猫好漂亮。。呵呵。 树怎么这么高啊!!!!压力好大。。!!!一切有为法: 就是所有的法。。 所有的法就是: 虚也在内,实也在内,虚实也在内。。就是能用这个概念概括的一切的东西,当然不止整个世界,可能是
C语言
70,037
社区成员
243,243
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章