在第一节课的讲解过程中涉及到了运算符重载的一些问题,引起了一些同学的思考,该问题的背景是教材6.2节中的Operator overloading。接下来对这一问题进行简要描述。通过教材第276页的内容可知,运算符重载有两种方式,一种是自由函数,另一种是类里面规定的方法。我们要讨论的是第二种重载方法。
设有两个类,比如猫类和狗类。现在假定在猫类中对猫+狗进行了运算符重载,并输出结果1。在狗类中也进行了猫+狗的运算符重载,并输出结果2。那么在主函数中进行猫+狗的运算,输出的结果是结果1还是结果2?
选项A.结果1;选项B.结果2;选项C.这样的设计是一种错误的设计,不应当设计矛盾的运算,因此会报错;选项D.这样的设计是没错的,但是输出结果和某些因素有关,因此不确定
为了找到答案,我进行了实际编程,并将源码上传至learn_c++: 测试学习c++ 。由于我刚刚学习了gitee,所以使用的不熟练,如果有问题请叫我修改。
类的文件规格按照书中的编写方式,每个类都有一个.h和.cpp。接口在.h中,实现在.cpp中。std::string operator+(mao m1,gou g1)是重载算符,实现猫+狗的方法,该方法在猫类中会返回字符串"this is m+g, this method is in mao class"。该方法同样出现在狗类中,在狗类中则会返回"this is m+g, this method is in gou class"。因此可以在主函数中通过打印猫+狗得到的字符串,得知到底是狗类的方法被调用还是猫类的方法被调用。
但是这样做有个问题,在猫类的.h文件中,为了让声明std::string operator+(mao m1,gou g1)时不出错,必须include狗的.h文件。不然的话,程序不认识第二个输入参数gou g1。同理在狗类的.h文件中,为了声明std::string operator+(mao m1,gou g1),必须包含猫类的.h文件,程序才能识别mao m1是猫类变量。这样的相互嵌套将会导致程序报错。
综上所述,我认为正确的答案可能是C.这样的设计是一种错误的设计,不应当设计矛盾的运算。即不应当设计两种同名的运算,它们的输入参数相同,但是结果不同。这种设计可能是病态的。