最近研究三进制,设计了一个显示三进制“位”的类。
什么意思呢?三进制有三个数字,比如0、1、2。
比如两位的三进制数字,无论十位、个位都只有三位数字:0、1、2。
我设计的这个类,就是为了显示三进制的0、1、2。
当然说这个类是一种“取模”操作更合适。
此类使用了C++运算符重载。
class Count
{
private:
int cn;//计数器
int md;//模
public:
Count() {
cn=0;
}
Count(int model)
{
md=model;
}
void model(int md)
{
this->md=md;
}
void zero()
{
cn=0;
}
void operator++(int)
{
cn=(cn+1)%md;
}
void operator=(int nright)
{
cn=nright%md;
}
int operator==(int nright)
{
if(cn==nright)
{
return 1;
}
else
{
return 0;
}
}
void test()
{
cout<<"count="<<cn<<""<<"model="<<md<<endl;
}
};
Count类重载了三个运算符,分别是:
- 后缀自增运算符
- 赋值运算符
- 比较运算符
以前在工作中对C++的运算符重载理解不深刻。这次回顾,很有心得。
一个C++类的运算符重载函数和这个类调用运算符重载函数是不同的。
比如一个Count对象Cobj,Cobj调用后缀自增运算符可以这样理解:Cobj.++()。
当然Cobj.++()这种写法是不正确的。正确的写法是:Cobj++。
按理说后缀自增是C++“数值类型”的运算行为。比如int型、short型等。但不能应用于C++的自定义类中。
C++支持的运算符重载是一种特殊类的函数。
以后缀自增运算符为例,为了保持类重载后缀自增与“数值类型”后缀自增的一致性。
Cobj.++() 写成了 Cobj++ 形式。这整形i的 i++形式一致。
同理,我设计的赋值运算符重载,应该是这个形式:
Cobj.=(int a)
参数 int a 这样设计是因为我需要对象Cobj调用的函数"=“右边是int型。
然后把”."去掉,就是正确形式:
Cobj=(int a)
同理,比较重载运算符是这样的:
Cobj==(int a)
如果Cobj对象的函数""的唯一参数是一个类的实例,假设是Count类的实例,可以这样写:
Cobj(Count ca)
最后强调一下重载后缀自增运算符的一个参数表明它是后缀自增函数。这是相对前缀自增来说的。