(用T表正确,用F表错误)。
A、int fp( );( ) B、void fp(char);( )
C、int fp(char,int);( ) D、void fp(char,int,int);( )
重载函数不是说只要参数类型和参数个数不一致就对吗?那样的话是不是都正确吗?
45 个解决方案
#1
回答正确,都正确
#2
难道你在哪本书上说他们中间有不对的??
那你应该换本书了
那你应该换本书了
#3
答案是A和D是对的,所以不明白为什么
#4
函数重载和函数参数的缺省值,应该二者取其一。
#5
我觉得A,B,D是正确的。int fp(char a,int b=0,double c=100.0);声明的时候不是给了默认参数吗?C区分不出来的。
#6
补充,B也是不对的。
#7
有什么问题?
#8
明白了,BC确实有问题
B、void fp(char);( )
C、int fp(char,int);( )
例如
调用fp('a')这时系统不知道用的是int fp(char a,int b=0,double c=100.0)还是B
调用fp('a',0)时系统不知道是int fp(char a,int b=0,double c=100.0)还是C
B、void fp(char);( )
C、int fp(char,int);( )
例如
调用fp('a')这时系统不知道用的是int fp(char a,int b=0,double c=100.0)还是B
调用fp('a',0)时系统不知道是int fp(char a,int b=0,double c=100.0)还是C
#9
就是只有A和D正确:
函数int fp(char a,int b=0,double c=100.0);的后两个形参提供了默认值。当调用到B和C函数时就会去调用int fp(char a,int b=0,double c=100.0);,不够的参数就使用形参提供的默认值。而A和D的参数类型和参数个数不一致,所以。。。。
函数int fp(char a,int b=0,double c=100.0);的后两个形参提供了默认值。当调用到B和C函数时就会去调用int fp(char a,int b=0,double c=100.0);,不够的参数就使用形参提供的默认值。而A和D的参数类型和参数个数不一致,所以。。。。
#10
我没考虑有int fp(char a,int b=0,double c=100.0)这个大前提,不好意思-_-
#11
B、C会产生二义性,因此是不正确的
#12
C肯定不对
B想不通………………
B想不通………………
#13
函数重载,基本的是函数名,而参数不同,目的是可以调用目标函数.
所以A是对的,B是错误的,B的参数只有一个char,而int fp(char a,int b=0,double c=100.0)的另外两个参数是缺省的,这样就不知道调用哪个了,虽然B的返回类型不一样,但是返回类型不是函数重载所关心的,C的道理和B的基本一样,D是对的,因为D的最后一个参数是int型,符合重载的条件.
所以A是对的,B是错误的,B的参数只有一个char,而int fp(char a,int b=0,double c=100.0)的另外两个参数是缺省的,这样就不知道调用哪个了,虽然B的返回类型不一样,但是返回类型不是函数重载所关心的,C的道理和B的基本一样,D是对的,因为D的最后一个参数是int型,符合重载的条件.
#14
试验了下B也是错误的
原来重载中void是当做任意类型
原来重载中void是当做任意类型
#15
楼上的完全正确!!
#16
B和C一样会产生二义性
#17
都是合法的重载。个人觉得你书上的答案是有问题。
要注意:重载和二义性是两个概念。重载合法并不意味着不会产生二义性。是否产生二义性关键看如何调用,而不是看你如何重载。
再说了,重载是前提,二义性是结果。如果重载不合法,那函数的声明都无法通过编译,哪里会有什么调用时产生二义性的问题?
要注意:重载和二义性是两个概念。重载合法并不意味着不会产生二义性。是否产生二义性关键看如何调用,而不是看你如何重载。
再说了,重载是前提,二义性是结果。如果重载不合法,那函数的声明都无法通过编译,哪里会有什么调用时产生二义性的问题?
#18
我一直以为重载 的返回类型也属于重载的判断范围
刚才试试了下
int fp(int a)
double fp( int a)
都编译不过
原来自己这么基础的东西没搞清楚
惭愧啊
#19
不会吧,老大。
提供了默认值以后,就不能再提供一个仅仅少了这个提供默认值的参数的重载函数了。
这里的二义性不是指程序本身二义,而是说对编译器来说,产生二义了,编译器不知道怎么选择重载函数了。
#20
不调用,就不知道二义性,编译就可以通过。如果调用了,就肯定编译不过了,编译器不知道选哪个函数。
所以,比较迷惑的是,你那个问题中,对函数正确性的定义。
所以,比较迷惑的是,你那个问题中,对函数正确性的定义。
#21
只有A 是对的. C 会产生二义性
B 和D 不属于重载
B 和D 不属于重载
#22
不是吧B D不是重载是什么
重载(overload)的就是 在同一个作用域里面 定义了多个同名的方法
#23
A是正确的
B不对,因为返回类型不同,无法声明,会跟int fp(char a,int b=0,double c=100.0);冲突,
一般会提示这样的错误:不能通过返会类型的不同来定义重载函数。
C不对 因为如调用一个fp(a,b)的函数,会跟int fp(char a,int b=0,double c=100.0);产生二义性。
D不对,类似于B的错误。
B不对,因为返回类型不同,无法声明,会跟int fp(char a,int b=0,double c=100.0);冲突,
一般会提示这样的错误:不能通过返会类型的不同来定义重载函数。
C不对 因为如调用一个fp(a,b)的函数,会跟int fp(char a,int b=0,double c=100.0);产生二义性。
D不对,类似于B的错误。
#24
今天终于发现了一个问题. 原来我一直对函数的重载都理解错了.
谢谢这发贴的人. 我搞懂了.
ABCD 都是对的.
A 不管在什么情况下都不会产生二义性
B 如果你调用函数时只传一个参数就产生二义性
C 如果你调用函数时只传二个参数就产生二义性
D 如果你调用函数时只传二个参数就产生二义性
谢谢这发贴的人. 我搞懂了.
ABCD 都是对的.
A 不管在什么情况下都不会产生二义性
B 如果你调用函数时只传一个参数就产生二义性
C 如果你调用函数时只传二个参数就产生二义性
D 如果你调用函数时只传二个参数就产生二义性
#25
LS
D没二义性吧
你只传2个参数 根本就调用不到D
D没二义性吧
你只传2个参数 根本就调用不到D
#26
都是重载
#27
要说有问题也是设计上的问题
#28
返回值不参与重载。。。。
不然:
int func(int i)
void func(int i)
如果调用:func(1),你说会调用那个函数?
#29
你试过吗?我试过的,没有问题。
其实这也不用试。
编译器为什么要选择重载函数?当然前提是先要有重载函数可供选择,如果你连重载都不对,那他还怎么选择?
所以,先有重载,后有二义性;重载没有问题,不代表调用时也没有问题。但反过来调用时有问题,不代表重载是非法的。
#30
以下程序在我的机器上编译运行一点问题都没有:
换句话说,只要你别进行有二义性的调用,编译器才懒得帮你检查“潜在的二义性”。或者有某些高档的编译器可能帮你warning一下,但那并不是必需做的。
#include <iostream>
using namespace std;
void f() {}
void f(int i = 0) {}
int main() {
f(1);
return 0;
}
换句话说,只要你别进行有二义性的调用,编译器才懒得帮你检查“潜在的二义性”。或者有某些高档的编译器可能帮你warning一下,但那并不是必需做的。
#31
wait
#32
函数重载的定义:C++允许定义多个相同名字的函数,只要这些函数的参数不同(至少参数类型或者参数数目或者参数类型的顺序不同)。
所以A,B,C,D都是正确的重载函数。
所以A,B,C,D都是正确的重载函数。
#33
回答30的楼的问题:
我在机子上测试了,你那样用的确没有问题,我觉的是那样用还没有让编译器感到二义性,若是改成这样编译器就会报错了,
#include <iostream>
using namespace std;
void f() {}
void f(int i = 0) {}
int main() {
f();//f(1)
return 0;
}
我在机子上测试了,你那样用的确没有问题,我觉的是那样用还没有让编译器感到二义性,若是改成这样编译器就会报错了,
#include <iostream>
using namespace std;
void f() {}
void f(int i = 0) {}
int main() {
f();//f(1)
return 0;
}
#34
原来重载中void是当做任意类型 学习了 我也不知道!!“重载中void是当做任意类型” 但是我知道BC是不对的 重载函数的参数必须相等 其他的不知道
#35
LS我理解错了
函数返回值是不做为重载判断的
表学错了
呵呵
函数返回值是不做为重载判断的
表学错了
呵呵
#36
A和D 吧
#37
A和D是对的
B中,假如给定了一个实参的函数调用,
如 fp('a');
函数B为精确匹配,
而原来的 函数 int fp(char a,int b=0,double c=100.0);
也是精确匹配,因为多出来的实参有缺省值,
两个函数都是精确匹配,导致二义性
C中的道理是一样的
#38
从定义上来说,确实是这样的
但是在于重载函数的解析上来说不一定是对的
因为在解析时,确认调用哪一个重载函数做为最佳可行函数的时候,
实际给出的实参可以比调用的函数参数少,但是多出来参数必须有缺省值
#39
A和D是对的 B传入一个char,C传入一个char和int就无法和提供的函数区分了
函数返回值是不能做重载标志的
还有如下的也不是重载
int fun(int n);
int fun(const int n);
int fun(int & n);
函数返回值是不能做重载标志的
还有如下的也不是重载
int fun(int n);
int fun(const int n);
int fun(int & n);
#40
函数重载具有三种匹配
精确匹配 提升匹配 标准匹配首先你需要从这个三个大方向去考虑
对于您上面的A和D我相信您一定您想得通了!很明显是精确匹配。
而对于B和C再没有默认参数的情况下相信您也乐意判定他也是正确的。但是有了默认的参数的时候,
例如您在程序中写下这样的程式void fp(‘c’);您可以精确的知道他匹配那一个函数吗,他既能与int fp(char a,int b=0,double c=100.0);精确匹配
同时也能和void fp(char);精确匹配,这无意就产生了程序的二义性。正如楼上所说的那样。
精确匹配 提升匹配 标准匹配首先你需要从这个三个大方向去考虑
对于您上面的A和D我相信您一定您想得通了!很明显是精确匹配。
而对于B和C再没有默认参数的情况下相信您也乐意判定他也是正确的。但是有了默认的参数的时候,
例如您在程序中写下这样的程式void fp(‘c’);您可以精确的知道他匹配那一个函数吗,他既能与int fp(char a,int b=0,double c=100.0);精确匹配
同时也能和void fp(char);精确匹配,这无意就产生了程序的二义性。正如楼上所说的那样。
#41
你是正确的。是我对重载函数理解有错。谢谢答复。
楼主的问题17楼晨星老大已经给出标准答案了。o(∩_∩)o...
#42
学习了
收益非浅
收益非浅
#43
路过
#44
顶!
#45
谢谢大家的帮助
#1
回答正确,都正确
#2
难道你在哪本书上说他们中间有不对的??
那你应该换本书了
那你应该换本书了
#3
答案是A和D是对的,所以不明白为什么
#4
函数重载和函数参数的缺省值,应该二者取其一。
#5
我觉得A,B,D是正确的。int fp(char a,int b=0,double c=100.0);声明的时候不是给了默认参数吗?C区分不出来的。
#6
补充,B也是不对的。
#7
有什么问题?
#8
明白了,BC确实有问题
B、void fp(char);( )
C、int fp(char,int);( )
例如
调用fp('a')这时系统不知道用的是int fp(char a,int b=0,double c=100.0)还是B
调用fp('a',0)时系统不知道是int fp(char a,int b=0,double c=100.0)还是C
B、void fp(char);( )
C、int fp(char,int);( )
例如
调用fp('a')这时系统不知道用的是int fp(char a,int b=0,double c=100.0)还是B
调用fp('a',0)时系统不知道是int fp(char a,int b=0,double c=100.0)还是C
#9
就是只有A和D正确:
函数int fp(char a,int b=0,double c=100.0);的后两个形参提供了默认值。当调用到B和C函数时就会去调用int fp(char a,int b=0,double c=100.0);,不够的参数就使用形参提供的默认值。而A和D的参数类型和参数个数不一致,所以。。。。
函数int fp(char a,int b=0,double c=100.0);的后两个形参提供了默认值。当调用到B和C函数时就会去调用int fp(char a,int b=0,double c=100.0);,不够的参数就使用形参提供的默认值。而A和D的参数类型和参数个数不一致,所以。。。。
#10
我没考虑有int fp(char a,int b=0,double c=100.0)这个大前提,不好意思-_-
#11
B、C会产生二义性,因此是不正确的
#12
C肯定不对
B想不通………………
B想不通………………
#13
函数重载,基本的是函数名,而参数不同,目的是可以调用目标函数.
所以A是对的,B是错误的,B的参数只有一个char,而int fp(char a,int b=0,double c=100.0)的另外两个参数是缺省的,这样就不知道调用哪个了,虽然B的返回类型不一样,但是返回类型不是函数重载所关心的,C的道理和B的基本一样,D是对的,因为D的最后一个参数是int型,符合重载的条件.
所以A是对的,B是错误的,B的参数只有一个char,而int fp(char a,int b=0,double c=100.0)的另外两个参数是缺省的,这样就不知道调用哪个了,虽然B的返回类型不一样,但是返回类型不是函数重载所关心的,C的道理和B的基本一样,D是对的,因为D的最后一个参数是int型,符合重载的条件.
#14
试验了下B也是错误的
原来重载中void是当做任意类型
原来重载中void是当做任意类型
#15
楼上的完全正确!!
#16
B和C一样会产生二义性
#17
都是合法的重载。个人觉得你书上的答案是有问题。
要注意:重载和二义性是两个概念。重载合法并不意味着不会产生二义性。是否产生二义性关键看如何调用,而不是看你如何重载。
再说了,重载是前提,二义性是结果。如果重载不合法,那函数的声明都无法通过编译,哪里会有什么调用时产生二义性的问题?
要注意:重载和二义性是两个概念。重载合法并不意味着不会产生二义性。是否产生二义性关键看如何调用,而不是看你如何重载。
再说了,重载是前提,二义性是结果。如果重载不合法,那函数的声明都无法通过编译,哪里会有什么调用时产生二义性的问题?
#18
我一直以为重载 的返回类型也属于重载的判断范围
刚才试试了下
int fp(int a)
double fp( int a)
都编译不过
原来自己这么基础的东西没搞清楚
惭愧啊
#19
不会吧,老大。
提供了默认值以后,就不能再提供一个仅仅少了这个提供默认值的参数的重载函数了。
这里的二义性不是指程序本身二义,而是说对编译器来说,产生二义了,编译器不知道怎么选择重载函数了。
#20
不调用,就不知道二义性,编译就可以通过。如果调用了,就肯定编译不过了,编译器不知道选哪个函数。
所以,比较迷惑的是,你那个问题中,对函数正确性的定义。
所以,比较迷惑的是,你那个问题中,对函数正确性的定义。
#21
只有A 是对的. C 会产生二义性
B 和D 不属于重载
B 和D 不属于重载
#22
不是吧B D不是重载是什么
重载(overload)的就是 在同一个作用域里面 定义了多个同名的方法
#23
A是正确的
B不对,因为返回类型不同,无法声明,会跟int fp(char a,int b=0,double c=100.0);冲突,
一般会提示这样的错误:不能通过返会类型的不同来定义重载函数。
C不对 因为如调用一个fp(a,b)的函数,会跟int fp(char a,int b=0,double c=100.0);产生二义性。
D不对,类似于B的错误。
B不对,因为返回类型不同,无法声明,会跟int fp(char a,int b=0,double c=100.0);冲突,
一般会提示这样的错误:不能通过返会类型的不同来定义重载函数。
C不对 因为如调用一个fp(a,b)的函数,会跟int fp(char a,int b=0,double c=100.0);产生二义性。
D不对,类似于B的错误。
#24
今天终于发现了一个问题. 原来我一直对函数的重载都理解错了.
谢谢这发贴的人. 我搞懂了.
ABCD 都是对的.
A 不管在什么情况下都不会产生二义性
B 如果你调用函数时只传一个参数就产生二义性
C 如果你调用函数时只传二个参数就产生二义性
D 如果你调用函数时只传二个参数就产生二义性
谢谢这发贴的人. 我搞懂了.
ABCD 都是对的.
A 不管在什么情况下都不会产生二义性
B 如果你调用函数时只传一个参数就产生二义性
C 如果你调用函数时只传二个参数就产生二义性
D 如果你调用函数时只传二个参数就产生二义性
#25
LS
D没二义性吧
你只传2个参数 根本就调用不到D
D没二义性吧
你只传2个参数 根本就调用不到D
#26
都是重载
#27
要说有问题也是设计上的问题
#28
返回值不参与重载。。。。
不然:
int func(int i)
void func(int i)
如果调用:func(1),你说会调用那个函数?
#29
你试过吗?我试过的,没有问题。
其实这也不用试。
编译器为什么要选择重载函数?当然前提是先要有重载函数可供选择,如果你连重载都不对,那他还怎么选择?
所以,先有重载,后有二义性;重载没有问题,不代表调用时也没有问题。但反过来调用时有问题,不代表重载是非法的。
#30
以下程序在我的机器上编译运行一点问题都没有:
换句话说,只要你别进行有二义性的调用,编译器才懒得帮你检查“潜在的二义性”。或者有某些高档的编译器可能帮你warning一下,但那并不是必需做的。
#include <iostream>
using namespace std;
void f() {}
void f(int i = 0) {}
int main() {
f(1);
return 0;
}
换句话说,只要你别进行有二义性的调用,编译器才懒得帮你检查“潜在的二义性”。或者有某些高档的编译器可能帮你warning一下,但那并不是必需做的。
#31
wait
#32
函数重载的定义:C++允许定义多个相同名字的函数,只要这些函数的参数不同(至少参数类型或者参数数目或者参数类型的顺序不同)。
所以A,B,C,D都是正确的重载函数。
所以A,B,C,D都是正确的重载函数。
#33
回答30的楼的问题:
我在机子上测试了,你那样用的确没有问题,我觉的是那样用还没有让编译器感到二义性,若是改成这样编译器就会报错了,
#include <iostream>
using namespace std;
void f() {}
void f(int i = 0) {}
int main() {
f();//f(1)
return 0;
}
我在机子上测试了,你那样用的确没有问题,我觉的是那样用还没有让编译器感到二义性,若是改成这样编译器就会报错了,
#include <iostream>
using namespace std;
void f() {}
void f(int i = 0) {}
int main() {
f();//f(1)
return 0;
}
#34
原来重载中void是当做任意类型 学习了 我也不知道!!“重载中void是当做任意类型” 但是我知道BC是不对的 重载函数的参数必须相等 其他的不知道
#35
LS我理解错了
函数返回值是不做为重载判断的
表学错了
呵呵
函数返回值是不做为重载判断的
表学错了
呵呵
#36
A和D 吧
#37
A和D是对的
B中,假如给定了一个实参的函数调用,
如 fp('a');
函数B为精确匹配,
而原来的 函数 int fp(char a,int b=0,double c=100.0);
也是精确匹配,因为多出来的实参有缺省值,
两个函数都是精确匹配,导致二义性
C中的道理是一样的
#38
从定义上来说,确实是这样的
但是在于重载函数的解析上来说不一定是对的
因为在解析时,确认调用哪一个重载函数做为最佳可行函数的时候,
实际给出的实参可以比调用的函数参数少,但是多出来参数必须有缺省值
#39
A和D是对的 B传入一个char,C传入一个char和int就无法和提供的函数区分了
函数返回值是不能做重载标志的
还有如下的也不是重载
int fun(int n);
int fun(const int n);
int fun(int & n);
函数返回值是不能做重载标志的
还有如下的也不是重载
int fun(int n);
int fun(const int n);
int fun(int & n);
#40
函数重载具有三种匹配
精确匹配 提升匹配 标准匹配首先你需要从这个三个大方向去考虑
对于您上面的A和D我相信您一定您想得通了!很明显是精确匹配。
而对于B和C再没有默认参数的情况下相信您也乐意判定他也是正确的。但是有了默认的参数的时候,
例如您在程序中写下这样的程式void fp(‘c’);您可以精确的知道他匹配那一个函数吗,他既能与int fp(char a,int b=0,double c=100.0);精确匹配
同时也能和void fp(char);精确匹配,这无意就产生了程序的二义性。正如楼上所说的那样。
精确匹配 提升匹配 标准匹配首先你需要从这个三个大方向去考虑
对于您上面的A和D我相信您一定您想得通了!很明显是精确匹配。
而对于B和C再没有默认参数的情况下相信您也乐意判定他也是正确的。但是有了默认的参数的时候,
例如您在程序中写下这样的程式void fp(‘c’);您可以精确的知道他匹配那一个函数吗,他既能与int fp(char a,int b=0,double c=100.0);精确匹配
同时也能和void fp(char);精确匹配,这无意就产生了程序的二义性。正如楼上所说的那样。
#41
你是正确的。是我对重载函数理解有错。谢谢答复。
楼主的问题17楼晨星老大已经给出标准答案了。o(∩_∩)o...
#42
学习了
收益非浅
收益非浅
#43
路过
#44
顶!
#45
谢谢大家的帮助