fraction operator-(const fraction& f1,const fraction& f2) { fraction f3; f3.top=f1.top*f2.bottom-f1.bottom*f2.top; f3.bottom=f1.bottom*f2.bottom; int a=gcd(f3.top,f3.bottom); f3.top=f3.top/a; f3.bottom=f3.bottom/a; return f3;//③ //返回计算结果 } ostream& operator<<(ostream& ostr,const fraction& cs) {ostr<<cs.top<<"/"<<cs.bottom; return ostr; } fraction operator*(fraction& f1,fraction& f2) //④ //一般函数实现乘法,形参为 f1,f2 { fraction f3; f3.settop(f1.get_top()*f2.get_top()); f3.setbottom(f1.getbottom()*f2.getbottom()); int a=gcd(f3.get_top(),f3.getbottom()); f3.settop(f3.get_top()/a); f3.setbottom(f3.getbottom()/a); return f3; }为什么下面的乘法重载没有const
时间: 2024-03-31 17:38:37 浏览: 73
在函数实现时,我们可以使用 const 关键字来保证函数不会修改传入的参数。但是在某些情况下,我们需要修改传入的参数或者返回一个非常量的值。在这种情况下,我们不能使用 const 关键字。
在这个例子中,我们需要修改传入的分数对象,计算它们的乘积并返回一个新的分数对象。因此,我们不能使用 const 关键字来限制这些参数的修改。
相关问题
二、程序填空题。在程序中序号所标志的位置补充代码,使程序能够满足功能说明的要求。将补充的代码填在回答区域所对应的序号处,然后截取运行截图。 下面代码实现分数的程序。 #pragma once #include <iostream> #include <stdio.h> using namespace std; int gcd(int a,int b); //求公约数函数 class fraction { int top; //分子 int bottom; //分母 public: fraction() { top = 0; bottom = 1; } //默认构造函数 fraction(int t,int b){top=t;bottom=b;} //一般构造函数 ( )//① 分数的加法 { top = top * f.bottom + bottom * f.top; bottom = bottom * f.bottom; int a = gcd(top, bottom); top = top / a; bottom = bottom / a; return *this; } int get_top() { ( ) //② 读取分子的值 } int get_bottom(){return bottom;} void set_top(int t){top=t;} void set_bottom(int b){bottom=b;} // 友元函数、分数减法 friend fraction operator-(const fraction& f1,const fraction& f2); friend ostream& operator<<(ostream& ostr,const fraction& cs); //输出 }; fraction operator-(const fraction& f1,const fraction& f2) { fraction f3; f3.top=f1.top*f2.bottom-f1.bottom*f2.top; f3.bottom=f1.bottom*f2.bottom; int a=gcd(f3.top,f3.bottom); f3.top=f3.top/a; f3.bottom=f3.bottom/a; ( ) //③ 返回计算结果 } ostream& operator<<(ostream& ostr,const fraction& cs) { ostr<<cs.top<<"/"<<cs.bottom; return ostr; } ( ) //④一般函数实现乘法,形参为f1,f2 { fraction f3; f3.set_top(f1.get_top()*f2.get_top()); f3.set_bottom(f1.get_bottom()*f2.get_bottom()); int a=gcd(f3.get_top(),f3.get_bottom()); f3.set_top(f3.get_top()/a); f3.set_bottom(f3.get_bottom()/a); return f3; } int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a % b); } //main.cpp #include "fraction.h" int main() { fraction f1(1,3); fraction f2(1,6); fraction f3; f3=f1+f2; cout<<f3<<endl; fraction f4(1,2); f3=f4-f2; cout<<f3<<endl; f3=f4*f2; cout<<f3<<endl; }
①
fraction operator+(const fraction& f){
fraction res;
res.top = top * f.bottom + bottom * f.top;
res.bottom = bottom * f.bottom;
int a = gcd(res.top, res.bottom);
res.top = res.top / a;
res.bottom = res.bottom / a;
return res;
}
②
int get_top() const {
return top;
}
③
return f3;
④
fraction operator*(const fraction& f1,const fraction& f2){
fraction f3;
f3.set_top(f1.get_top()*f2.get_top());
f3.set_bottom(f1.get_bottom()*f2.get_bottom());
int a=gcd(f3.get_top(),f3.get_bottom());
f3.set_top(f3.get_top()/a);
f3.set_bottom(f3.get_bottom()/a);
return f3;
}
纠正这个代码的错误之处#include <iostream> #include <string> using namespace std; class Fraction { private: int numerator; // 分子 int denominator; // 分母 public: Fraction(int num, int den); // 构造函数 // 重载运算符 Fraction operator+(const Fraction &fra) const; Fraction operator-(const Fraction &fra) const; Fraction operator*(const Fraction &fra) const; Fraction operator/(const Fraction &fra) const; Fraction& operator=(const Fraction &fra); void print() const; // 打印结果 }; // 构造函数 Fraction::Fraction(int num, int den) { // 省略部分代码 } // 重载加法运算符 Fraction Fraction::operator+(const Fraction &fra) const { // 省略部分代码 } // 重载减法运算符 Fraction Fraction::operator-(const Fraction &fra) const { // 省略部分代码 } // 重载乘法运算符 Fraction Fraction::operator*(const Fraction &fra) const { // 省略部分代码 } // 重载除法运算符 Fraction Fraction::operator/(const Fraction &fra) const { // 省略部分代码 } // 重载赋值运算符 Fraction& Fraction::operator=(const Fraction &fra) { // 省略部分代码 } // 打印最简分数或带分数 void Fraction::print() const { // 省略部分代码 } int main() { int x_num, x_den, y_num, y_den; cout << "Input x: "; scanf("%d/%d", &x_num, &x_den); // 格式化输入 cout << "Input y: "; scanf("%d/%d", &y_num, &y_den); // 格式化输入 Fraction x(x_num, x_den); Fraction y(y_num, y_den); Fraction result; // 加法 result = x + y; cout << "x+y="; result.print(); // 减法 result = x - y; cout << "x-y="; result.print(); // 乘法 result = x * y; cout << "x*y="; result.print(); // 除法 result = x / y; cout << "x/y="; result.print(); return 0; }
这段代码看起来没有什么明显的错误,但是有一些需要注意的地方:
1. 在类的定义中,构造函数应该放在 public 权限下,否则在 main() 函数中无法调用。
2. 使用 scanf() 函数进行输入时,需要包含头文件 <cstdio>。
3. 在 operator=() 函数中,应该返回一个引用类型的对象,即 Fraction&。
4. 在 main() 函数中,应该使用 cout 而不是 printf() 进行输出。
修改后的代码如下:
```
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
class Fraction {
public:
Fraction(int num, int den); // 构造函数
Fraction& operator=(const Fraction &fra); // 重载赋值运算符
Fraction operator+(const Fraction &fra) const; // 重载加法运算符
Fraction operator-(const Fraction &fra) const; // 重载减法运算符
Fraction operator*(const Fraction &fra) const; // 重载乘法运算符
Fraction operator/(const Fraction &fra) const; // 重载除法运算符
void print() const; // 打印结果
private:
int numerator; // 分子
int denominator; // 分母
};
// 构造函数
Fraction::Fraction(int num, int den) {
numerator = num;
denominator = den;
}
// 重载赋值运算符
Fraction& Fraction::operator=(const Fraction &fra) {
numerator = fra.numerator;
denominator = fra.denominator;
return *this;
}
// 重载加法运算符
Fraction Fraction::operator+(const Fraction &fra) const {
int num = numerator * fra.denominator + denominator * fra.numerator;
int den = denominator * fra.denominator;
return Fraction(num, den);
}
// 重载减法运算符
Fraction Fraction::operator-(const Fraction &fra) const {
int num = numerator * fra.denominator - denominator * fra.numerator;
int den = denominator * fra.denominator;
return Fraction(num, den);
}
// 重载乘法运算符
Fraction Fraction::operator*(const Fraction &fra) const {
int num = numerator * fra.numerator;
int den = denominator * fra.denominator;
return Fraction(num, den);
}
// 重载除法运算符
Fraction Fraction::operator/(const Fraction &fra) const {
int num = numerator * fra.denominator;
int den = denominator * fra.numerator;
return Fraction(num, den);
}
// 打印最简分数或带分数
void Fraction::print() const {
int integer = numerator / denominator;
int num = numerator % denominator;
int den = denominator;
int gcd = __gcd(num, den);
num /= gcd;
den /= gcd;
if (integer != 0) {
cout << integer << " ";
}
if (num != 0) {
cout << num << "/" << den;
} else {
cout << 0;
}
cout << endl;
}
int main() {
int x_num, x_den, y_num, y_den;
cout << "Input x: ";
scanf("%d/%d", &x_num, &x_den); // 格式化输入
cout << "Input y: ";
scanf("%d/%d", &y_num, &y_den); // 格式化输入
Fraction x(x_num, x_den);
Fraction y(y_num, y_den);
Fraction result;
// 加法
result = x + y;
cout << "x+y=";
result.print();
// 减法
result = x - y;
cout << "x-y=";
result.print();
// 乘法
result = x * y;
cout << "x*y=";
result.print();
// 除法
result = x / y;
cout << "x/y=";
result.print();
return 0;
}
```
阅读全文