#include <iostream.h> class CComplex { public: CComplex(double r = 0, double i = 0) { real = r; imag = i; } int operator int() { return (int)real; } void Display(void) { cout << "(" << real << "," << imag << ")" << endl; } protected: double real; double imag; }; class CVector { public: CVector(CComplex &obj1, CComplex &obj2, CComplex &obj3, CComplex &obj4) { objArray[0] = obj1; objArray[1] = obj2; objArray[2] = obj3; objArray[3] = obj4; } friend CComplex &operator[](CVector obj, int n); private: CComplex objArray[4]; }; CComplex &operator[](CVector obj, int n) { if(n<0 || n>3) { cout<<"Out of range!"<<endl; exit(0); } return obj.objArray[n]; } int main() { CComplex c1(1.1, 1.1); CComplex c2(2.2, 2.2); CComplex c3(3.3, 3.3); CComplex c4(4.4, 4.4); CVector v(c1,c2,c3,c4); v[0].Display(); v[1].Display(); v[2].Display(); v[3].Display(); v[0] = 5.5; ----------------------------------------------------------① v[1] = CComplex(6.6); -------------------------------------------② v[2] = int(CComplex(7.7)); --------------------------------------③ v[3] = int(CComplex(8.8,9.9)); ----------------------------------④ v[0].Display(); v[1].Display(); v[2].Display(); v[3].Display(); return 0; } 问题一:上述程序存在两大错误,在不修改主函数和程序原意的前提下,改正该程序中存在的错误。 问题二:①处的转换属于显式转换还是隐式转换,并解释该转换过程。 问题三:②处的转换属于显式转换还是隐式转换,并解释该转换过程。 问题四:解释③处的转换过程。 问题五:解释④处的转换过程。
时间: 2023-08-15 15:22:25 浏览: 68
问题一:
错误1:在CVector类的构造函数中,传递的参数CComplex &应该改为const CComplex &,以避免在函数中对参数的修改。
正确的构造函数应该是这样的:
CVector(const CComplex &obj1, const CComplex &obj2, const CComplex &obj3, const CComplex &obj4)
{
objArray[0] = obj1;
objArray[1] = obj2;
objArray[2] = obj3;
objArray[3] = obj4;
}
错误2:在CComplex类中,将operator int()重载为将实部转换为int类型,这是不合理的,应该将该运算符重载为将复数转换为int类型。
正确的运算符重载应该是这样的:
operator int()
{
return (int)(real + imag);
}
问题二:
①处的转换属于显式转换,因为将double类型的值转换为CComplex类型的值需要使用构造函数进行显式转换。
转换过程是这样的:将5.5转换为CComplex类型的值,调用CComplex类的构造函数CComplex(double r = 0, double i = 0),将5.5作为实部,0作为虚部构造一个CComplex类型的值,然后将这个值赋给v[0]。
问题三:
②处的转换属于显式转换,因为将int类型的值转换为CComplex类型的值需要使用构造函数进行显式转换。
转换过程是这样的:将6.6转换为CComplex类型的值,调用CComplex类的构造函数CComplex(double r = 0, double i = 0),将6.6作为实部,0作为虚部构造一个CComplex类型的值,然后将这个值赋给v[1]。
问题四:
③处的转换是将CComplex类型的值转换为int类型的值,需要使用CComplex类中重载的operator int()运算符进行隐式转换。
转换过程是这样的:将CComplex(7.7)转换为int类型的值,首先调用CComplex类的构造函数CComplex(double r = 0, double i = 0),将7.7作为实部,0作为虚部构造一个CComplex类型的值,然后调用CComplex类中重载的operator int()运算符,将实部转换为int类型的值7,最后将7赋给v[2]。
问题五:
④处的转换是将CComplex类型的值转换为int类型的值,需要使用CComplex类中重载的operator int()运算符进行隐式转换。
转换过程是这样的:将CComplex(8.8,9.9)转换为int类型的值,首先调用CComplex类的构造函数CComplex(double r = 0, double i = 0),将8.8作为实部,9.9作为虚部构造一个CComplex类型的值,然后调用CComplex类中重载的operator int()运算符,将实部和虚部相加(结果为18.7),并将结果转换为int类型的值18,最后将18赋给v[3]。
阅读全文