c++第九章-(运算符重载)
来源:互联网 发布:mac关闭日历广告 编辑:程序博客网 时间:2024/05/17 04:33
一些规则
1.c++不允许用户自己定义新的运算符,只能对已有的c++运算符进行重载。
2.除了五个运算符不允许重载外,其他运算符允许重载:
- .成员访问运算符
- *成员指针访问运算符
- ::与运算符
- sizeof尺寸运算符
- ?:条件运算符
3.重载运算符必须和用户定义的自定义类型的对象一起使用。(也就是说,参数不能全部都是c++的标准类型,这样约定是为了防止用户修改用于标准类型结构的运算符性质)
4.为什么运算符重载函数有两个参数,只需有一个参数?
其实是有一个参数是隐含着的,运算符函数是用this指针隐式地访问类对象的成员。
5.参数传值分三种,值传递、地址传递和引用传值。
class Complex{public: Complex(); Complex(double r,double i); Complex operator+(Complex &d);//“引用传值” void print();private: double real; double imag;};Complex::Complex(){ real = 0; imag = 0;}Complex::Complex(double r,double i){ real = r; imag = i;}Complex Complex::operator+(Complex &d){ Complex c; c.real = real + d.real; c.imag = imag + d.imag; return c;}void Complex::print(){ std::cout << "(" << real << "," << imag << "i)\n";}int main(int argc, const char * argv[]){ Complex c1(3,4),c2(5,-10),c3; c3 = c1 + c2; std::cout << "c1 = "; c1.print(); std::cout << "c2 = "; c2.print(); std::cout << "c1 + c2 = "; c3.print(); return 0;}
控制台返回的结果是:
c1 = (3,4i)c2 = (5,-10i)c1 + c2 = (8,-6i)
2.重载加减乘除操作符,实现有理数运算demo
#include <stdlib.h>class Rational{public: Rational(int num,int denom);//num用于分子,denom用于分母 Rational operator+(Rational rhs); Rational operator-(Rational rhs); Rational operator*(Rational rhs); Rational operator/(Rational rhs); void print();private: void normalize();//负责对分数简化 int numerator; int denominator;};Rational::Rational(int num,int denom){ this->numerator = num; this->denominator = denom; normalize();}Rational Rational::operator+(Rational rhs){ int a = numerator; int b = denominator; int c = rhs.numerator; int d = rhs.denominator; int e = a * b + c * d; int f = b * d; return Rational(e,f);}Rational Rational::operator-(Rational rhs){ rhs.numerator = -rhs.numerator; return operator+(rhs);}Rational Rational::operator*(Rational rhs){ int a = numerator; int b = denominator; int c = rhs.numerator; int d = rhs.denominator; int e = a * c; int f = b * d; return Rational(e,f);}Rational Rational::operator/(Rational rhs){ int t = rhs.numerator; rhs.numerator = rhs.denominator; rhs.denominator = t; return operator*(rhs);}void Rational::print(){ if (numerator % denominator == 0) { std::cout << numerator / denominator; } else { std::cout << numerator << "/" << denominator; }}void Rational::normalize(){ if (denominator < 0)//确保分母为正 { numerator = -numerator; denominator = -denominator; } //欧几里德算法 int a = abs(numerator);//求绝对值 int b = abs(denominator); //求最大公约数 while (b > 0) { int t = a % b; a = b; b = t; } //分子、分母分别除于最大公约数得到最简化分数 numerator /= a; denominator /= a;}int main(int argc, const char * argv[]){ Rational f1(2,16); Rational f2(7,8); Rational res = f1 + f2; f1.print(); std::cout << " + "; f2.print(); std::cout << " = "; res.print(); std::cout << "\n"; res = f1 - f2; f1.print(); std::cout << " - "; f2.print(); std::cout << " = "; res.print(); std::cout << "\n"; res = f1 * f2; f1.print(); std::cout << " * "; f2.print(); std::cout << " = "; res.print(); std::cout << "\n"; res = f1 / f2; f1.print(); std::cout << " / "; f2.print(); std::cout << " = "; res.print(); std::cout << "\n"; return 0;}
控制台返回的结果:
1/8 + 7/8 = 11/8 - 7/8 = -3/41/8 * 7/8 = 7/641/8 / 7/8 = 1/7
3.重载<<操作符
事实上,我们没法再现有的ostream类专门添加一个新的operator<<()方法。
所以只能够定义一个正常的函数再外部重载这个操作符,这与重载方法的语法大同小异,唯一的区别是不再有一个对象可以用来调用<<重载函数,而不得不通过第一个输入参数向这个重载方法传递对象。
operator<<()函数原型,std::ostream&operator<<(std::ostream &os,Ratinoal f),第一个输入参数os是将要向它写数据的那个流,他是以“引用传递”方式传递的。第二个输入参数是打算写到那个流里的数据值,不同的operator<<()重载函数就是因为这个输入参数才相互区别的。
#include <stdlib.h>class Rational{public: Rational(int num,int denom);//num用于分子,denom用于分母 Rational operator+(Rational rhs); Rational operator-(Rational rhs); Rational operator*(Rational rhs); Rational operator/(Rational rhs); void print();private: void normalize();//负责对分数简化 int numerator; int denominator; friend std::ostream &operator << (std::ostream &os,Rational f);//用于访问私有变量};Rational::Rational(int num,int denom){ this->numerator = num; this->denominator = denom; normalize();}Rational Rational::operator+(Rational rhs){ int a = numerator; int b = denominator; int c = rhs.numerator; int d = rhs.denominator; int e = a * b + c * d; int f = b * d; return Rational(e,f);}Rational Rational::operator-(Rational rhs){ rhs.numerator = -rhs.numerator; return operator+(rhs);}Rational Rational::operator*(Rational rhs){ int a = numerator; int b = denominator; int c = rhs.numerator; int d = rhs.denominator; int e = a * c; int f = b * d; return Rational(e,f);}Rational Rational::operator/(Rational rhs){ int t = rhs.numerator; rhs.numerator = rhs.denominator; rhs.denominator = t; return operator*(rhs);}void Rational::print(){ if (numerator % denominator == 0) { std::cout << numerator / denominator; } else { std::cout << numerator << "/" << denominator; }}void Rational::normalize(){ if (denominator < 0)//确保分母为正 { numerator = -numerator; denominator = -denominator; } //欧几里德算法 int a = abs(numerator);//求绝对值 int b = abs(denominator); //求最大公约数 while (b > 0) { int t = a % b; a = b; b = t; } //分子、分母分别除于最大公约数得到最简化分数 numerator /= a; denominator /= a;}int main(int argc, const char * argv[]){ Rational f1(2,16); Rational f2(7,8); Rational res = f1 + f2; f1.print(); std::cout << " + "; f2.print(); std::cout << " = "; res.print(); std::cout << "\n"; res = f1 - f2; f1.print(); std::cout << " - "; f2.print(); std::cout << " = "; res.print(); std::cout << "\n"; res = f1 * f2; f1.print(); std::cout << " * "; f2.print(); std::cout << " = "; res.print(); std::cout << "\n"; std::cout << f1 << " / " << f2 << " = " << (f1/f2) << "\n"; return 0;}std::ostream &operator << (std::ostream &os,Rational f);std::ostream &operator << (std::ostream &os,Rational f){ os << f.numerator << "/" << f.denominator; return os;}
0 0
- c++第九章-(运算符重载)
- 第九周(运算符重载)
- 运算符重载(c++)
- 第九周(运算符重载复数类)
- 第九周(运算符重载时间类)
- 第九周(运算符重载时间类)
- 第九周(运算符重载分数类)
- 第九周(运算符重载分数类)
- 第九周-项目一运算符重载
- 重载赋值运算符(c/c++)
- C++-运算符重载
- [C++]重载运算符
- C#:运算符重载
- c++-++运算符重载
- C++:重载运算符
- 运算符重载(C++)
- [c++]运算符重载
- 【C++】运算符重载
- ios调试技巧
- 跳出双层for循环
- Form-based File Upload in HTML(RFC-1867)
- c++第六章-(友元)
- c++第五章-(类与对象、构造器和析构器)
- c++第九章-(运算符重载)
- c++第八章-(虚方法与抽象方法)
- c++第七章-(静态属性和静态方法)
- 破解中国楼市之谜
- c++第十章-(多继承与虚继承)
- c++第十二章 -(动态管理内存、动态数组和函数返回动态内存)
- c++第十四章-(类型强转换)
- cocoaPods安装与使用
- 《将博客搬至CSDN》