C/C++培训
达内IT学院
400-996-5531
这篇文章讲述了c++的自定义类型的运算。是小编结合C++培训课程中的知识总结出来的,希望可以帮助到同学们!
一:首先说明下成员函数和非成员函数的区分
class A
{
public:
void f1(){}; // 这个就是成员函数。
void f2(); // 这个也是成员函数声明,其实现在类的外部。
};
void A::f2(){} // 这个是成员函数的实现。
void f3(){}; // 这个就是非成员函数,它不属于A,也不属于任何一起其他的类。
*加上下面二中的运算符重载为非成员函数和成员函数
二.运算符重载函数
1.五个运算符不允许重载
(1).成员访问运算符
(2).*成员指针运算符
(3)::作用域区分运算符
(4)?:条件运算符
(5)sizeof 测数据空间大小运算符
2.在可重载的运算符中除了new和delete以外,任何运算符都可以重载为成员函数,但不得重载为静态函数。
(附):静态函数参见另一篇文章
(正式进入主题)
二.运算符重载
1.运算符重载为非成员函数和成员函数对比(重载+ - * /)
#include<iostream>
using namespace std;
class Complex
{
protected:
double real,image;
public:
Complex(double r=0,double i=0){real=r;image=i;}
friend Complex operator-(Complex c1,Complex c2);//非成员函数,用friend作用是友元函数可以用类中的任何数据
Complex operator+(Complex c1);//成员函数
void show(){cout<<real<<"+"<<image<<"i"<<endl;}
};
Complex Complex::operator+(Complex c1)//成员函数实现
{
return Complex(real+c1.real,image+c1.image);
}
Complex operator-(Complex c1,Complex c2)//非成员函数实现
{
return Complex(c1.real-c2.real,c1.image-c2.image);
}
int main()
{
Complex c3,c1(3,4),c2(1,2);
c3=c1-c2;//即c3=operator-(c1,c2),顺便说一下如果两边都是Complex类型赋值运算符不用重载
c3.show();
c3=c1+c2;//即c3=c1.operator+(c2)
c3.show();
return 0;
}
运行结果:
2+2i
4+6i
2.重载++ --
Complex operator ++();//前置加1运算符
Complex operator ++(int)//后置加1运算符函数
(举个栗子):
Complex& Complex::operator++()//顺便讲一下这里的引用是为了在return *this时少调用一次复制构造函数,以及可以出现在等号左边如:++c1=...
{
++real;
return *this;//返回值已变
}
Complex Complex::operator(int)
{
return Complex(real++,image);//返回值不变
}
3.重载 =
注意点:
赋值运算符只能作为成员函数重载(重点);
举个例子:FunType& operator = (FunType&,FunType);//错误!因为只能作为成员函数重载
要求第一操作数必须是左值,即加引用;
重载 = 一般与深拷贝浅拷贝挂钩,所以建议读者去看作者另一篇文章是c++深拷贝与浅拷贝
4.重载类型转换符,即强制类型转换
一般用法(省略了一些代码,只讲关于运算符的代码):
class
{
private:
double:real,image;
public:
operator lue();//类型转换运算符函数
};
Complex::operator lue()
{
return real;//只返回了实数
}
int main()
{
Complex a(1,2);
lue(a);
}
特殊用法:在重载=运算符时,当运算符两边数据类型不同时,会自动进行类型转换,如果右边是对象,在类中要找强制类型转换符
如 t=c[j];(wustacm平台的1457题)
在类中要加上operator double(){return radius;}
5.重载下标访问运算符 []
注意点:
返回必须引用,因为赋值运算符会出现在=左边。
代码:
class
{
private:
double *data;
public:
double& operator[](int index);//声明时注意引用
};
double& Array::operator[](int index)
{
if(...)
return data[...];
}
6.重载>>和<<运算符
class Circle
{
private:
radius;
public:
friend istream& operator>>(istream&i,Circle &m);//非成员函数
friend ostream& operator<<(ostream&o,Circle &m);
};
istream& operator>>(istream&i,Circle &m)
{
cin>>m.radius;
return i;
}
ostream& operator<<(ostream&o,Circle m)
{
cout<<m.radius;
return o;//是o不是0
}
免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容
填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
Copyright © 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有
Tedu.cn All Rights Reserved