C++中没有发生函数重载

function overloading not happening in C++

本文关键字:函数 重载 C++      更新时间:2023-10-16

我使用的是borland turbo C++编译器(4.5)。这是我的代码,但我收到的错误如下:"time::add(time)"的多个声明。在这里,我对add()进行了三次重载,错误出现在第三次重载中,即"void add(time t1)"中。

 #include<iostream.h>
 #include<conio.h>
 class time
 {
 int h,m;
 public:
 void input()
 {
    cout<<"n Enter hour :";
    cin>>h;
    cout<<"n Enter min :";
    cin>>m;
 }
 void display()
 {
    cout<<"n time is : "<<h<<":"<<m;
 }
 void add(time t1,time t2)
 {
    h=t1.h+t2.h+(t1.m+t2.m)/60;
    m=(t1.m+t2.m)%60;
 }
 time add(time t1)
 {
     time t3;
     t3.h=h+t1.h+(m+t1.m)/60;
     t3.m=(m+t3.m)%60;
     return t3;
 }
 void add(time t1)
 {
    h=h+t1.h+(m+t1.m)/60;
    m=(m+t1.m)%60;
 }
 };
 int main()
 {
    time t1,t2,t3;
    t1.input();
    t2.input();
    t3.add(t1,t2);
    t3.display();
    t3=t2.add(t1);
    t3.display();
    t2.add(t1);
    t2.display();
    return 0;
 }

在C++中,不能仅根据返回类型来重载函数:

time add(time t1) {...}
void add(time t1) {...}

我建议用重载运算符++=替换三个add()函数。这将解决歧义,也将明确哪些操作修改对象,哪些操作返回新对象。

返回类型不是函数签名的一部分

函数名称、修饰符和参数分别为。保留函数名称并更改其他名称会导致重载。

这是因为如果只编写add(t);,编译器不可能知道要调用哪种方法。

1.3.11签名

关于参与过载解析(13.3)的函数的信息:其参数类型列表(8.3.5),如果函数是类成员,函数上的cv限定符(如果有的话)它本身和在其中声明成员函数的类。[…]

这意味着,如果函数是类的一部分,也可以通过添加const修饰符来重载它。

此外,如果声明为const,则参数类型也会发生更改。

不能仅根据返回类型voidtime重载add函数。

在C++中,不能根据函数的返回类型重载函数,而这正是您想要做的。只能根据函数的参数或常量重载函数。

我也会考虑改用更现代的编译器,Borland C++4.5已经过时了,甚至不符合第一个C++标准,更不用说当前的标准了。

要使函数重载工作,重载中必须有不同的参数,您不能重载返回值。

 void add(time t1,time t2)
 void add(time t1)

很好,

 time add(time t1)
 void add(time t1)

不是

Rick,

问题是

time add(time t1)

void add(time t1)

你不能用这种方式超载。只有一个add和一个time参数。

函数重载不能仅基于返回类型来完成,因为编译器将不知道要调用哪个函数,因为返回类型和指定变量之间可能存在隐式转换。