C++运算符重载
2016-06-12 17:49
309 查看
C++能够重载绝大部分运算符,其中有4个运算符不能被重载,如下表所示:
只能重载为成员函数的运算符,如下表所示:
下面是运算符建议重载:
下面写出重载"+"运算符的示例:
上面提供两种方式重载"+"运算符,一种是类的成员函数,另一种是类的友元函数实现,两种实现均能实现重载"+"运算符,区别是他们的作用域不相同。下面是输出结果:
可以看出上面调用的是友元函数重载的"+"运算符,OverLoadobject3=object1+object2;//相当于OverLoad object3 = operator +(object1, object2);
上面示例是两个对象的类型相同,下面将介绍运算符重载二元操作的操作数的类型不相同。
输出如下:
zhang1994J@163.com
吃饭
中午去吃饭
2016-06-13 11-00
zhang1994J@163.com
午休
中午午休
2016-06-13 12-45
. | 成员选择符 |
.* | 成员对象选择符 |
:: | 域解析操作符 |
?: | 条件操作符 |
Sizeof() | 长度运算符 |
= | 赋值运算符 |
[] | 下标运算符 |
() | 函数运算符 |
-> | 间接成员访问 |
->* | 间接取值访问 |
下面是运算符建议重载:
运算符 | 建议 |
所有一元运算符 | 成员 |
= [] () -> ->* | 必须是成员 |
+ = -= 、= *= ^= &= != %= > >= < <= | 成员 |
其他二元操作符 | 非成员 |
#include <iostream>
class OverLoad
{
public:
OverLoad(int x1 = 0, int x2 = 0);
const OverLoad operator +(const OverLoad &other)const;
void print()const;
friend const OverLoad operator+(const OverLoad &object1, const OverLoad &object2);
private:
int operator1;
int operator2;
};
OverLoad::OverLoad(int x1, int x2):
operator1(x1),
operator2(x2)
{
}
const OverLoad OverLoad::operator +(const OverLoad &other)const
{
OverLoad temp;
temp.operator1 = this->operator1 + other.operator1;
temp.operator2 = this->operator2 + other.operator2;
std::cout<<"operator+(const OverLoad &other)"<<std::endl;
return temp;
}
void OverLoad::print()const
{
std::cout<<"operator1:"<<this->operator1<<", operator2:"<<this->operator2<<std::endl;
}
const OverLoad operator +(const OverLoad &object1, const OverLoad &object2)
{
OverLoad temp;
temp.operator1 = object1.operator1 + object2.operator1;
temp.operator2 = object1.operator2 + object2.operator2;
std::cout<<"operator +(const OverLoad &object1, const OverLoad &object2)"<<std::endl;
return temp;
}
int main()
{
OverLoad object1(10, 15), object2(13, 16);
OverLoad object3 = object1 + object2;
object3.print();}
上面提供两种方式重载"+"运算符,一种是类的成员函数,另一种是类的友元函数实现,两种实现均能实现重载"+"运算符,区别是他们的作用域不相同。下面是输出结果:
operator +(const OverLoad &object1, const OverLoad &object2) operator1:23, operator2:31
可以看出上面调用的是友元函数重载的"+"运算符,OverLoadobject3=object1+object2;//相当于OverLoad object3 = operator +(object1, object2);
上面示例是两个对象的类型相同,下面将介绍运算符重载二元操作的操作数的类型不相同。
#include <iostream>
using std::string;
class Mail;
class Sender
{
public:
Sender(string address);
Sender &operator <<( Mail &mail);
private:
string m_address;
};
Sender::Sender(string address)
:m_address(address)
{
}
class Mail
{
public:
Mail(string title, string content, string time);
friend Sender &Sender::operator <<( Mail &mail);
private:
string m_title;
string m_content;
string m_time;
};
Mail::Mail(string title, string content, string time)
:m_title(title),
m_content(content),
m_time(time)
{
}
Sender & Sender::operator <<( Mail &mail)
{
std::cout<<m_address<<std::endl;
std::cout<<mail.m_title<<std::endl;
std::cout<<mail.m_content<<std::endl;
std::cout<<mail.m_time<<std::endl;
return *this;
}
int main()
{
Sender sender("zhang1994J@163.com");
Mail mail1("吃饭","中午去吃饭","2016-06-13 11-00"), mail2("午休", "中午午休", "2016-06-13 12-45");
sender<<mail1<<mail2;}
输出如下:
zhang1994J@163.com
吃饭
中午去吃饭
2016-06-13 11-00
zhang1994J@163.com
午休
中午午休
2016-06-13 12-45
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua中关系运算符的使用教程
- Lua学习笔记之运算符和表达式
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C#运算符重载用法实例分析
- C#中重载与重写区别分析
- C#中多态、重载、重写区别分析
- C++联合体转换成C#结构的实现方法
- sql server 2008中的apply运算符使用方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C#中38个常用运算符的优先级的划分和理解
- C++变位词问题分析