运算符重载(二)(C++)------实例
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了运算符重载(二)(C++)------实例,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5126字,纯文字阅读大概需要8分钟。
内容图文
![运算符重载(二)(C++)------实例](/upload/InfoBanner/zyjiaocheng/639/6c9e57cadba942d78f4d74a35d4d95e3.jpg)
程序实例
复数类
复数类型的加法运算:实部加实部,虚部加虚部
1.重载 " + ":
CComplex CComplex:: operator+(const CComplex &src)
{
return CComplex(src.mreal + mreal, src.mimage + mimage);
}
我们发现了一个问题,类似 com4 = com1 + 10; 是可以成功的,因为右操作数作为参数传递进来进行了类型转换,而com4 = 10 + com1;是错误的,因为操作符左边需要调用重载函数,因此我们将其实现为全局函数(友元):
CComplex operator+(const CComplex &lhs, const CComplex &rhs)
// 定义为全局 可实现类似 comp4 = 10 + comp3,左边参数会进行隐式转换
{
return CComplex(lhs.mreal + rhs.mreal, lhs.mimage + rhs.mimage);
}
2.重载输入输出操作符" << “、” >> ":
ostream& operator<<(ostream &out, const CComplex &src)
{
out << "mreal = " << src.mreal << ", mimage = " << src.mimage << endl;
return out;
}
istream& operator>>(istream &in, CComplex &src) // 不能声明为const 因为要进行修改
{
in >> src.mreal >> src.mimage;
return in;
}
3.重载" += "操作符
void CComplex :: operator+=(const CComplex &src)
{
mreal += src.mreal;
mimage += src.mimage;
}
4.重载前置++操作符
CComplex& CComplex :: operator++()
{
mreal++;
mimage++;
return *this;
}
5.重载后置++操作符
// 后置单目运算符重载为类的成员函数时,函数要带有一个整型形参。
CComplex CComplex :: operator++(int)
{
return CComplex(mreal++, mimage++);
}
6.完整Code
class CComplex
{
public:
CComplex(int real = 0, int image = 0):mreal(real), mimage(image) {};
CComplex operator+(const CComplex &src);
void operator+=(const CComplex &src);
CComplex operator++(int);
CComplex& operator++();
private:
int mreal;
int mimage;
friend istream& operator>>(istream &in, CComplex &src);
friend ostream& operator<<(ostream &out, CComplex &src);
friend CComplex operator+(const CComplex &lhs, const CComplex &rhs);
};
CComplex CComplex:: operator+(const CComplex &src)
{
return CComplex(src.mreal + mreal, src.mimage + mimage);
}
ostream& operator<<(ostream &out, const CComplex &src)
{
out << "mreal = " << src.mreal << ", mimage = " << src.mimage << endl;
return out;
}
istream& operator>>(istream &in, CComplex &src) // 不能声明为const 因为要进行修改
{
in >> src.mreal >> src.mimage;
return in;
}
void CComplex :: operator+=(const CComplex &src)
{
mreal += src.mreal;
mimage += src.mimage;
}
CComplex CComplex :: operator++(int)//后置++
{
return CComplex(mreal++, mimage++);
}
CComplex& CComplex :: operator++()//前置+++
{
mreal++;
mimage++;
return *this;
}
CComplex operator+(const CComplex &lhs, const CComplex &rhs)
// 定义为全局 可实现类似 comp3 = 10 + comp2,左边参数会进行隐式转换
{
return CComplex(lhs.mreal + rhs.mreal, lhs.mimage + rhs.mimage);
}
int main()
{
CComplex com(10, 10);
cout << com;
CComplex com1(20, 10);
com1 += com;
cout << com1;
CComplex com2;
com2 = com + com1;
cout << com2;
CComplex com3 = com2++;
cout << com3;
cout << com2;
com3 = ++com2;
cout << com3;
cout << com2;
CComplex com4;
cin >> com4;
cout << com4;
com4 += com1;
cout << com4;
com4 = com1 + 10;
cout << com4;
com4 = 10 + com1;
cout << com1;
cout << com4;
}
String类实现(部分)
class CString
{
public:
CString(char *p = NULL)
{
if(p != NULL)
{
_pstr = new char[strlen(p) + 1];//加1是因为字符串是以'\0'结束,strlen是求的有效长度
strcpy(_pstr, p);
}
else
{
_pstr = new char[1];
*_pstr = '\0';//这样处理是为了不用每次使用都要考虑nullptr的情况
}
}
~CString()
{
if (_pstr != NULL)
{
delete []_pstr;
_pstr = NULL;
}
}
CString(const CString &src)
{
_pstr = new char[strlen(src._pstr) + 1];
strcpy(_pstr, src._pstr);
}
CString& operator=(const CString &src)
{
if(this == &src)
return *this;
delete []_pstr;
_pstr = new char[strlen(src._pstr) + 1];
strcpy(_pstr, src._pstr);
return *this;
}
bool operator>(const CString &src)const
{
return (strcmp(_pstr, src._pstr) > 0);
}
bool operator<(const CString &src)const
{
return (strcmp(_pstr, src._pstr) < 0);
}
bool operator==(const CString &src)const
{
return (strcmp(_pstr, src._pstr) == 0);
}
int length()const
{
return strlen(_pstr);
}
char operator[](int index)const//只进行读操作,写成常方法(const),普通对象和常对象均可以调用
{
return _pstr[index];
}
const char* c_str()const
{
return _pstr;
}
private:
char *_pstr;
friend CString operator+(const CString &lhs, const CString &rhs);
friend ostream& operator<<(ostream &out, const CString &str);
friend istream& operator>>(istream &in, CString &str);
};
CString operator+(const CString &lhs, const CString &rhs)
{
char *newString = new char[lhs.length() + rhs.length() + 1];
strcpy(newString, lhs._pstr);
return CString(strcat(newString, rhs._pstr));
}
ostream& operator<<(ostream &out, const CString &str)
{
out << str._pstr;
return out;
}
istream& operator>>(istream &in, CString &str)
{
char temp[100];
in >> temp;
str._pstr = new char[strlen(temp) + 1];
strcpy(str._pstr, temp);
return in;
}
int main()
{
CString str1 = "aaa";
CString str2 = str1;
CString str3;
str3 = str1;
CString str4 = str1 + str3;
str4 = str1 + "bbb";
str4 = "aaa+ str1;
cout << str4 << endl;
if (str4 > str1)
{
cout << "str4 > str1" << endl;
}
else
{
cout << "str4 < str1" << endl;
}
int len = str4.length();
for (int i = 0; i < len; i++)
{
//str4.operator[](int index)
cout << str4[i]<< " ";
}
cout << endl;
//string char[]
char buf[1024] = { 0 };
strcpy(buf, str4.c_str());
cout << "buf:" << buf << endl;
CString test;
cin >> test;
cout << test << endl;;
CString test1 = "AAAA";
cout << test1 << endl;
cout << (test == test1) << endl;
return 0;
}
内容总结
以上是互联网集市为您收集整理的运算符重载(二)(C++)------实例全部内容,希望文章能够帮你解决运算符重载(二)(C++)------实例所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。