C++面向对象操作符重载:算术操作符和关系操作符

来源:互联网 发布:女生 投行 知乎 编辑:程序博客网 时间:2024/05/22 15:07

1、算术操作符包括 :+、-、*、/、%(求余),-=,+=...
       逻辑运算符主要包括:<、>、==,&&,||

2、算术运算符和关系操作符要定义为非成员函数,这是因为上述的运算符均为双目运算符,且运算结束后返回的不是对象本身。

3、算术运算符一般返回一个值的拷贝,如果一定要返回某个值的引用,请一定返回const引用,因为引用可以当做左值,返回const引用,可以避免误操作。

const Book & operator+(const Book &lhs,const Book& rhs){       lhs.price+=rhs.price;       return lhs;}
因为不能返回临时对象的引用,我们的操作只能是在左操作数或是右操作数中选择一个。如果返回非const引用,那么存在如下的情况:

m_Book1 + m_Book2 = m_Book3;
这可能是不小心而致的,这地方想要修改 + 操作返回的值,如果是非const引用,那么同时也对原值进行了修改,而这一点有可能很多人都不会意识到,所以如果要使用引用,一定要设为const引用。

倘若我们返回值的拷贝呢?

Book operator+(const Book &lhs,const Book& rhs){       Book b_Temp;       b_Temp.price = lhs.price+rhs.price;       return b_Temp;}
这样的操作便不会有问题了,即便我们想从新对返回的值进行赋值也是可以的。

4、看一个实际的例子:

#include <iostream>#include <string>using namespace std;class MyString{private:int m_Lenth;string m_str;public:MyString(){m_Lenth = 0;m_str = " ";}MyString(string strTemp):m_str(strTemp){m_Lenth = strTemp.size();}MyString(const MyString &m_MyStr);MyString &operator = (const MyString &m_MyStr);friend MyString operator+(const MyString &lhs,const MyString &rhs);friend bool operator<(const MyString &lhs,const MyString &rhs);friend ostream& operator<<(ostream &out,const MyString& m_MyStr);};MyString::MyString(const MyString &m_MyStr){this->m_Lenth = m_MyStr.m_Lenth;this->m_str = m_MyStr.m_str;}MyString &MyString::operator = (const MyString &m_MyStr){MyString strTemp(m_MyStr);this->m_Lenth = m_MyStr.m_Lenth;this->m_str = m_MyStr.m_str;return *this;}MyString operator+(const MyString &lhs,const MyString &rhs){MyString strTemp;strTemp.m_str = lhs.m_str+rhs.m_str;strTemp.m_Lenth = lhs.m_Lenth+rhs.m_Lenth;return strTemp;}bool operator<(const MyString &lhs,const MyString &rhs){bool m_LessThan = false;if(lhs.m_str<rhs.m_str){m_LessThan = true;}return m_LessThan;}ostream& operator<<(ostream &out,const MyString& m_MyStr){out<<m_MyStr.m_Lenth<<endl;out<<m_MyStr.m_str<<endl;return out;}int main(){string str1 = "today";string str2 = "beautiful";MyString m_str1(str1);MyString m_str2(str2);cout<<"Display The Small One:"<<endl;cout<<(m_str1<m_str2?m_str1:m_str2)<<endl;MyString m_str3 = m_str1+m_str2;cout<<m_str3;return 0;}

程序运行的结果如下所示:


这个例子借用了string模板中的算法,当然在实例中所遇到的情况千差万别,重要的是理解。一旦长缨在手,他日何惧苍龙。到目前为止,接触的已经是C++中高级的部分了,把这一部分知识学好,基础打牢,在处理大程序方面也会是得心应手的。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脸上长了很多痣怎么办 做过狐臭的疤痕怎么办 痤疮留下的红印怎么办 脸上疤掉了黑印怎么办 脸上有黑色的疤怎么办 一只眼睛外斜视怎么办 残币银行不给换怎么办 手上有多套房的怎么办 长了两层脚指甲怎么办 指甲长了两层怎么办 脚趾甲长了两层怎么办 产妇气血虚没奶怎么办 哺乳期气血不足奶水少怎么办 刚怀孕喝了啤酒怎么办 受风怎么办最快最有效 孕妇后背受风了怎么办 肩膀和后背受风怎么办 手指关节杵肿了怎么办 骨关节退行性变怎么办 疼风脚趾肿了怎么办 痛风脚右侧肿了怎么办 痛风引起的脚肿怎么办 老人腰闪了该怎么办 腰闪了站不起来怎么办 又怕冷又爱上火怎么办 肝上多发小囊肿怎么办 5岁宝宝咳嗽厉害怎么办 5岁宝宝咳嗽有痰怎么办 生川乌外贴中毒怎么办 7个月宝宝流鼻涕怎么办 脸上皮肤毛孔粗大有黑头怎么办 嗓子长了个囊肿怎么办 食管胃粘膜异位怎么办 狗狗肿瘤破了怎么办 婴儿胃食道反流怎么办 小儿胃食道反流怎么办 放疗后咳嗽痰多怎么办 胃息肉是恶性的怎么办 老是胃疼,胃胀怎么办 吃完饭之后胃胀怎么办 胃痛胃胀怎么办能缓解