首页 > 试题广场 >

2个同名成员函数,可以重载的是()?

[不定项选择题]

2个同名成员函数,可以重载的是()?

  • int A::f() 和double A::f()
  • void A::f(int) 和void A::f(short)
  • void A::f() 和void A::f() const
  • void A::f(int) 和void A::f(const int)
  • const int A::f() 和int A::f()
各项分别考察如下知识点
A.B.E.选项:
不同的返回值不能区分重载函数,只有函数名、形参个数、形参类型可以

C.选项:
常成员函数的const限定符用于修饰隐式第一形参this
this的原类型为
Type * const this; 
是一个指针常量
成员函数加上const修饰后 this 的类型变为
const Type * const this; 
是一个指向常量的指针常量
编译器通过这个手段
令常成员函数作用于一个常量对象
实现了常成员函数内不能修改当前对象的数据成员的语言特性

C++规定
重载函数的指针形参
如果要以const进行区分
只有当修饰的const为底层const
而非顶层const时才可以区分
也就是说
const必须修饰指针指向的对象而非指针本身
所以假如this指针是由原类型变为
Type * this; 
那么是不能区分该参数的
D.选项也是一个很好的顶层const的例子
对于一个普通的非复合类型
其const总是顶层const(修饰本身)
对于一个引用
其const总是底层const(修饰所引用的对象)

编辑于 2017-09-10 12:07:34 回复(2)
  1. A.返回值不能区分重载函数,只有形参的个数、类型或者顺序可以
  2. B.int和short不一样,所以可以重载
  3. C.const放在函数后面是指这个成员函数为常成员函数,不能修改类里的成员变量,可以起到重载的作用。
  4. D.int和const int都是int类型,区别是后者不能对形参进行修改而已,这样写不可以重载,编译会报错。
  5. E.函数前面加const也起不来重载的作用,其作用在于声明返回的值为cosnt不可修改,绝大多数情况下没啥意义。
        PS:声明一个成员函数的时候用const关键字是用来说明这个函数是 "只读(read-only)"函数,也就是说明这个函数不会修改任何数据成 员(object) 为了声明一个const成员函数,const关键字放在函数括号的后面。声明和定义的时候都应该放const关键字。
                任何不会修改数据成员的函数都应该声明为const类型,如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这可以提高程序的健壮性。

编辑于 2020-10-31 20:55:03 回复(1)

关于const & 重载

传值

void fun(int a)和void fun(const int a); ——不可以重载

二者实际上没有区别,因为函数调用的时候,存在形实结合的过程,所以不管有没有const都不会改变实参的值

传指针

void fun(const char *a) 和void fun(char *a) ——可以重载

二者参数不同: 一个是“指向字符的指针”,另一个是“指向const char 的指针”。

void fun(char * const a) 和void fun(char * a) —— 不可重载

这个和上面的“int”类似。

深入探究

(In C)传参类似赋值——parameter = argument,
在ANSI C 中有一句话,大意是“如果两个***作数是指针,但是限定符(qualifiers)不同,那么左边那个必须拥有‘所有右边那哥们拥有的限定符”。

上面那句话有点绕, 例如:

const char * ccp = char * cp —— 是对的;
反过来,char * cp = const char * ccp ——不对,需要显式转换。(根据我在linux上的实测,gcc只是Warning——discard 'const')

发表于 2018-09-25 13:00:49 回复(0)
不会- -
发表于 2017-08-21 16:39:51 回复(1)
说一下D。
当传入const类型变量时,会有二义性,因此非成员函数的const不能实现重载。

发表于 2018-03-19 17:06:21 回复(0)

D选项说明下,当你用数字常量来调用时,编译器区分不了。。。

发表于 2019-08-20 19:32:26 回复(0)
void func1(int b)
{
}
void func1(const int b)
{
}
*********不是重载
void func2(int& b)
{
}
void func2(const int& b)
{
}
*********是重载
void func3(int* b)
{
}
void func3(const int* b)
{
}
*********是重载
void func4(int* b)
{
}
void func4(int* const b)
{
}
*********不是重载


发表于 2019-06-07 11:33:14 回复(0)
重载:1.参数不同(数据类型、个数、顺序不同);2.函数名相同,相同的范围,返回值类型可以相同可以不同。

看选项:A选项只有返回值不同,不满足条件,不行;B选项正确;C选项中第二个是常函数,算重载(具体怎么解释我也还不太懂,等我去请教下大神,哈哈!);D选项参数类型不同,是重载;E选项和A选项一样的问题,不算。
发表于 2017-08-22 14:50:58 回复(2)
重载:在同一可访问区内被声明的几个具有不同参数列表(参数的类型,参数个数,顺序不同)的同名函数,程序会根据不同的参数列表确定调用哪个函数。重载不关心函数返回值类型。
① double calculate(double);  ② double calculate(double,double); ③ double calculate(double, int); ④ double calculate(int, double); ⑤ double calculate(int); ⑥ float calculate(float); ⑦ float calculate(double); ⑥是函数重载,但是⑦不是

发表于 2017-08-22 00:02:44 回复(0)
想问一下,C是对的,那么如何分别调用
void A::f() 和void A::f() const
这两个函数呢?
发表于 2020-07-10 20:09:27 回复(3)
关于D:
void fun(int a) 和void fun(const int a)不是重载的关系!
据说是为了和C语言兼容,因为C语言中有上述用法,但是C语言没有重载概念,所以这里不是重载。

void fun(int &a) 和void fun(const int &a)呢?——这个确实是重载!
这是C++里面规定的,不怕和C语言不兼容吗?
不怕,因为C语言中没有引用的概念!
发表于 2018-11-22 09:47:01 回复(0)
对C,常对象只能调用常成员函数,普通对象既可以调用普通成员函数,也可以调用常成员函数,可以区别开。
对D,整型常量和整型变量都可以调用f(int)和f(const int),造成二义性

发表于 2018-07-23 23:17:46 回复(0)
D选项参数类型不同,一个int,一个const int,为啥不是重载
发表于 2018-01-05 22:51:55 回复(1)
看半天没看懂题目意思,是我理解力太弱了么?
编辑于 2020-06-06 14:57:49 回复(0)
  1. 相同函数名: 函数重载的关键在于具有相同的函数名,但不同的参数列表。参数列表包括参数的数量、类型和顺序。

  2. 函数签名: 函数的唯一标识由函数名和参数列表组成,这被称为函数的签名。不同的函数必须有不同的函数签名。

  3. 返回类型不是函数签名的一部分: 函数的返回类型不影响函数签名。因此,你可以有不同返回类型的重载函数,只要它们的参数列表不同。

发表于 2023-10-31 21:48:46 回复(0)
c 常对象只能调用常成员函数
发表于 2021-06-16 11:00:16 回复(0)
const必须修饰指针指向的对象而非指针本身
发表于 2020-11-03 20:58:20 回复(0)
重载函数记住同名不同参数
发表于 2020-08-07 00:23:52 回复(0)
在c++中,函数重载时,返回类型可以不同,但其特征标(形参个数、类型)也必须不同!
所以A是错误的!

发表于 2019-04-19 20:50:25 回复(0)

C,常函数,今上午才查的,怎么现在就忘了

发表于 2017-09-01 21:28:49 回复(0)