一元操作符重载
2014-08-13 15:56
169 查看
操作符重载就是把操作符(比如'+,-,*,/'这些运算符)赋于新的意义。
C++有许多内置的数据类型,包括int,char,double等,每一种类型都有许多运算符,例如加,减,乘,除等。当用户定义了类的对象时,两个对象之间是不能进行这些操作的,比如定义一个Money类的对象,它有元和角两个变量,对象a的属性是5元5角,对象b的属性是3元7角,总共是9元2角。但是a+b,这样的语句如果没有重载+运算符就会出错。你需要重新定义+的功能,使其按照你定义的规则进行处理。可以先把a对象的5元5角化成55角,b化成37角,然后以角为单位相加。加完之后再化成元角的形式返回给对象。
C++有许多内置的数据类型,包括int,char,double等,每一种类型都有许多运算符,例如加,减,乘,除等。当用户定义了类的对象时,两个对象之间是不能进行这些操作的,比如定义一个Money类的对象,它有元和角两个变量,对象a的属性是5元5角,对象b的属性是3元7角,总共是9元2角。但是a+b,这样的语句如果没有重载+运算符就会出错。你需要重新定义+的功能,使其按照你定义的规则进行处理。可以先把a对象的5元5角化成55角,b化成37角,然后以角为单位相加。加完之后再化成元角的形式返回给对象。
#include <iostream> #include <cstdlib> #include <cmath> using namespace std; //Class for amounts of money in U.S. currency. class Money { public: Money( ); Money(double amount); Money(int dollars, int cents); Money(int dollars); double getAmount( ) const; int getDollars( ) const; int getCents( ) const; void input( ); //Reads the dollar sign as well as the amount number. void output( ) const; const Money operator +(const Money& amount2) const; const Money operator -(const Money& amount2) const; bool operator ==(const Money& amount2) const; const Money operator -( ) const; private: int dollars; //A negative amount is represented as negative dollars and int cents; //negative cents. Negative $4.50 is represented as -4 and -50 int dollarsPart(double amount) const; int centsPart(double amount) const; int round(double number) const; }; int main( ) { Money yourAmount, myAmount(10, 9); cout << "Enter an amount of money: "; yourAmount.input( ); cout << "Your amount is "; yourAmount.output( ); cout << endl; cout << "My amount is "; myAmount.output( ); cout << endl; if (yourAmount == myAmount) cout << "We have the same amounts.\n"; else cout << "One of us is richer.\n"; Money ourAmount = yourAmount + myAmount; yourAmount.output( ); cout << " + "; myAmount.output( ); cout << " equals "; ourAmount.output( ); cout << endl; Money diffAmount = yourAmount - myAmount; yourAmount.output( ); cout << " - "; myAmount.output( ); cout << " equals "; diffAmount.output( ); cout << endl; return 0; } /* 第一个const表示Money为常量类型,第二个const表示不改变调用实参,第二个const表示不改变调用对象*/ const Money Money::operator +(const Money& secondOperand) const { int allCents1 = cents + dollars*100; int allCents2 = secondOperand.cents + secondOperand.dollars*100; int sumAllCents = allCents1 + allCents2; int absAllCents = abs(sumAllCents); //Money can be negative. int finalDollars = absAllCents/100; int finalCents = absAllCents%100; if (sumAllCents < 0) { finalDollars = -finalDollars; finalCents = -finalCents; } return Money(finalDollars, finalCents); } const Money Money::operator -(const Money& secondOperand) const { int allCents1 = cents + dollars*100; int allCents2 = secondOperand.cents + secondOperand.dollars*100; int diffAllCents = allCents1 - allCents2; int absAllCents = abs(diffAllCents); int finalDollars = absAllCents/100; int finalCents = absAllCents%100; if (diffAllCents < 0) { finalDollars = -finalDollars; finalCents = -finalCents; } return Money(finalDollars, finalCents); } bool Money::operator ==(const Money& secondOperand) const { return ((dollars == secondOperand.dollars) && (cents == secondOperand.cents)); } const Money Money::operator -( ) const { return Money(-dollars, -cents); } Money::Money( ): dollars(0), cents(0) {/*Body intentionally empty.*/} Money::Money(double amount) : dollars(dollarsPart(amount)), cents(centsPart(amount)) {/*Body intentionally empty*/} Money::Money(int theDollars) : dollars(theDollars), cents(0) {/*Body intentionally empty*/} //Uses cstdlib: Money::Money(int theDollars, int theCents) { if ((theDollars < 0 && theCents > 0) || (theDollars > 0 && theCents < 0)) { cout << "Inconsistent money data.\n"; exit(1); } dollars = theDollars; cents = theCents; } double Money::getAmount( ) const { return (dollars + cents*0.01); } int Money::getDollars( ) const { return dollars; } int Money::getCents( ) const { return cents; } //Uses iostream and cstdlib: void Money::output( ) const { int absDollars = abs(dollars); int absCents = abs(cents); if (dollars < 0 || cents < 0)//accounts for dollars == 0 or cents == 0 cout << "$-"; else cout << '$'; cout << absDollars; if (absCents >= 10) cout << '.' << absCents; else cout << '.' << '0' << absCents; } //Uses iostream and cstdlib: void Money::input( ) { char dollarSign; //先输入美元符号'$' cin >> dollarSign; //hopefully if (dollarSign != '$') { cout << "No dollar sign in Money input.\n"; exit(1); } double amountAsDouble; //再输入钱数 cin >> amountAsDouble; dollars = dollarsPart(amountAsDouble); //分别取得美元和美分部分 cents = centsPart(amountAsDouble); } int Money::dollarsPart(double amount) const { return static_cast<int>(amount); //向下取整 <int>(2.9)为2 截断取整 } int Money::centsPart(double amount) const { double doubleCents = amount*100; int intCents = (round(fabs(doubleCents)))%100;// 负数用%会出错 can misbehave on negatives 取余数 if (amount < 0) intCents = -intCents; return intCents; } int Money::round(double number) const //四舍五入取整,const不改变调用对象number, { return static_cast<int>(floor(number + 0.5)); }
相关文章推荐
- 一元运算符操作符重载
- C# 一元操作符及重载
- C++运算符重载(4) - 不能被重载的操作符
- C++ primer 箭头操作符重载心得体会
- c++操作符重载
- C++容易出错的操作符重载
- CLR via C#学习笔记:C#操作符重载学习( 基于.NET3.5 )
- C++ 中重载 + 操作符的正确方法
- 重载的操作符成员函数与非成员函数
- 重载new delete操作符是怎么调用的
- C++中重载+操作符的正确方法
- C++重载输入和输出操作符以及IO标准库中的刷新输入缓冲区残留字符问题
- 关于C++操作符重载之"->"和"*"
- 我的学习笔记——c++拷贝构造函数,重载赋值操作符
- C++中的操作符重载
- 拷贝构造函数与重载赋值操作符的区别
- 操作符函数及重载(1)
- 【M7】千万不要重载&&,||和,操作符
- C++的输入输出操作符重载
- c++类的拷贝构造函数、隐式转换、重载的赋值操作符的一些分析和实例