永发信息网

C++高手请进~~~void f(int a)和void f(const int a)

答案:6  悬赏:0  手机版
解决时间 2021-11-18 02:06
C++高手请进~~~void f(int a)和void f(const int a)
最佳答案
因为这两个函数的参数类型都是一样的。不同的是前者是一个变量。后者是一个常量。const只是一个修饰符,在传参的时候,比如 f(5),那么这个时候编译器就不知道调用哪一个了。因为这两个都符合调用;
函数重载的条件是:作用域+返回类型+函数名+参数列表 这几个条件不能完全相同;否则就不能算重载只能算是重复定义。追问5在C++编译器中是const int类型的~~~所以应该调用f(const int a)啊,为什么会是重复定义呢?追答但是f(5)同时也符合f(int a)啊,这样编译器就不知道该调用谁了。当然会出错啦
值传递和地址传递是有区别的

补充:
用const 修饰函数的参数
如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const 修饰,否则该参数将失去输出功能。const 只能修饰输入参数:
如果输入参数采用“指针传递”,那么加const 修饰可以防止意外地改动该指针,起到保护作用。
例如StringCopy 函数:
void StringCopy(char *strDestination, const char *strSource);
其中strSource 是输入参数,strDestination 是输出参数。给strSource 加上const修饰后,如果函数体内的语句试图改动strSource 的内容,编译器将指出错误。
如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const 修饰。
例如不要将函数void Func1(int x) 写成void Func1(const int x)。同理不要将函数void Func2(A a) 写成void Func2(const A a)。其中A 为用户自定义的数据类型。
对于非内部数据类型的参数而言,象void Func(A a) 这样声明的函数注定效率比较底。因为函数体内将产生A 类型的临时对象用于复制参数a,而临时对象的构造、复制、析构过程都将消耗时间。
为了提高效率,可以将函数声明改为void Func(A &a),因为“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。但是函数void Func(A &a) 存在一个缺点:
“引用传递”有可能改变参数a,这是我们不期望的。解决这个问题很容易,加const修饰即可,因此函数最终成为void Func(const A &a)。
以此类推,是否应将void Func(int x) 改写为void Func(const int &x),以便提高效率?完全没有必要,因为内部数据类型的参数不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当。
全部回答
这两个函数是重载的关系追问不是重载,编译器认为是重复定义~~~追答这两个函数的形参类型和个数是一样的,所以编译器认为是重复定义
因为函数名都是f,并且都只有一个参数,当然是同一个啊追问有个东西叫函数重载~~~追答你在楼上的"void f(int a)和void f(char a)就OK啊~~~"是肯定的啊,因为函数名虽然都是f,凡是参数一个是int,一个是char,所以编译器会认为是不同的函数追问那现在一个参数是int,一个参数是const int,应该也是不同的函数啊,为什么编译器会认为重复定义?追答但是加上const 只是多了一个常量修饰,但是本质上是一样的啊
void f(int a)括号里面的是形参,跟函数作用、内容有关,但跟函数类型无关,f是该函数的名字,只能声明一次,因此f(int a)与f(float b)是属于同一个函数,就像系统声明cin是输入,你就不能再声明它输出,追问有个东西叫函数重载~~~你应该去看看追答哦,那就只有linux0510说得较充分啦,谢谢你教会我新东西
c标准规定,同一模块里,变量名和函数名不能重用。
否则的话,我们写
void * w = f ;
那w到底是哪个函数的地址那?!追问有个东西叫函数重载~~~void f(int a)和void f(char a)就OK啊~~~
因为函数调用时 有2 义性,无法从 参数类型 和 参数个数 作区分。
例如 f(1) 和 f(2) , 调用 f(int a) 还是 f(const int a)?
所以是 重复定义函数。
重载,要能区分 参数类型 和 参数个数。追问那为什么f(int *a) 还是 f(const int *a)是重载(已经测试过)?追答*a 是指针,编译器认为 能区分 参数类型 和 参数个数 就允许。
--
f(1) 和 f(2) , 调用 f(int a) 还是 f(const int a)?你不能区分,编译器也不能区分。追问1或者2在C++编译器中是const int类型的~~~所以应该调用f(const int a)~~~表示能区分
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
我想学习产品结构设计...请问谁知道有这方面
2011年底和县、含山正式划为马鞍山?
从马鞍山到滁州凤阳县全程高速需要经过多少收
装苹果 10个装一箱可以装6箱,如果20个装一箱
在卡诺图中,怎么判定几何相邻及逻辑相邻?
螺纹底孔使用铰刀和不使用铰刀,是什么意思,孔
仓房口村地址在什么地方,我要处理点事!
烧伤了怎么办?
阆中公交司机一月工资多少?
养适合高原生活的狗
场内和场外的区别
加普威th850g打印出来的字会重叠怎么办1
朋友请客点九个菜什么意思
脚摔成这样几天能好,有什么办法能快点恢复
如何在win7系统下安装10系统
推荐资讯
被羁押半年最后判无罪能不能申请国家赔偿?
我是本科电子信息工程专业的应届生,校招得到
雄杰二手车地址在什么地方,我要处理点事!
成语学()()深
ftpServ怎么弄两个用户 一个匿名一个普通用户
男生在QQ发enemy是什么意思
4斤脂肪和60斤肌肉区别究竟有多大,有图有真
E/e-Mark认证的E标志
协调有序的近义词是什么?
上联:千秋锁锁千秋
用友T+与易订货可以对接不?
请问这蓝色字分别是什么字体?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?