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

ric*_*ick 3 c++

我正在使用borland turbo C++编译器(4.5).这是我的代码,但我得到的错误如下:'time :: add(time)'的多个声明.这里我重载了add()三次错误来自第3次重载,即"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;
 }
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 13

在C++中,您不能仅仅在返回类型上重载函数:

time add(time t1) {...}
void add(time t1) {...}
Run Code Online (Sandbox Code Playgroud)

我会建议更换三个add()带运算符重载函数++=.这将解决歧义,并且还将清楚地说明哪些操作修改了对象,哪些操作返回了新对象.


Luc*_*ore 6

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

函数名,修饰符和参数是.保留函数名称并更改其他名称会导致重载.

这是因为如果您只是编写,编译器可能无法知道要调用哪个方法add(t);.

1.3.11签名

有关参与重载决策的函数的信息(13.3):它的参数类型列表(8.3.5),如果函数是类成员,函数本身和类的cv限定符(如果有的话)其中声明了成员函数.[...]

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

此外,如果声明参数类型也会更改const.