64,647
社区成员
发帖
与我相关
我的任务
分享
#ifndef _Number_H_
#define _Number_H_
#include <iostream>
using namespace std;
#define UINT unsigned int
#define BYTE unsigned char
#define CBYTE const unsigned char
#define CUINT const unsigned int
class CNumber{
public:
CNumber(char *p=NULL);
~CNumber(){
MyNumber_delete();};
CNumber(CNumber&);
CNumber &operator=(CNumber&);
public:
bool operator<(CNumber&);
bool operator>(CNumber&);
bool operator==(CNumber&);
bool operator<=(CNumber&);
bool operator>=(CNumber&);
void operator+=(CNumber &t);
void operator-=(CNumber &t);
CNumber & operator++();
CNumber & operator++(int i);
/* CNumber & operator--(int i);*/
CNumber & operator--();
public:
friend CNumber &operator+(CNumber&,CNumber&);
friend CNumber &operator-(CNumber&,CNumber&);
friend CNumber &operator*(CNumber&,CNumber&);
friend CNumber &operator/(CNumber&,CNumber&);
public:
friend ostream & operator<<(ostream &,CNumber&);
/*
public:
void* operator new(std::size_t size) ;
void* operator new(std::size_t size, const std::nothrow_t&) ;
void operator delete(void* ptr) throw();
void operator delete(void* ptr, const std::nothrow_t&) ;
void* operator new[](std::size_t size) ;
void* operator new[](std::size_t size, const std::nothrow_t&) ;
void operator delete[](void* ptr) throw();
void operator delete[](void* ptr, const std::nothrow_t&) ;*/
public:
inline int CompareFountionEx(CNumber &t){//带符号比较
if(Symbols == t.Symbols){
int m_i = CompareFountion(HideNumber,t.HideNumber,Length,t.Length);
if(Symbols){
if(m_i!=2)
return m_i^1;
}
return m_i;
}
else{
if(Symbols)
return 0;
return 1;
}
}
inline int CompareFountion(BYTE *t1,BYTE *t2,UINT m_x){//不带符号比较
for(int i=m_x-1;i>=0;i--){
if(t1[i]>t2[i])
return 1;
else if(t1[i] == t2[i]){
if(i==0)
return 2;
continue;
}
else
return 0;
}
return -1;
}
inline int CompareFountion(BYTE *t1,BYTE *t2,UINT leng1,UINT leng2){//同长度比较
if(leng1>leng2)
return 1;
else if(leng1<leng2)
return 0;
else
return CompareFountion(t1,t2,leng1);
}
BYTE * DIVFountion(BYTE *,BYTE *,UINT,UINT,UINT &);
BYTE * AddFountion(BYTE *,BYTE *,UINT,UINT,UINT &);
BYTE * SubFountion(BYTE *,BYTE *,UINT,UINT,UINT &,UINT&,UINT m_z = -1);
BYTE * MulFountion(BYTE *,BYTE *,UINT,UINT,UINT &);
public:
inline BYTE * NumberBack(){
return Number;
}
inline UINT LengthBack(){
return Length;
}
inline BYTE * HideNumberBack(){
return HideNumber;
}
inline UINT SymbolsBack(){
return Symbols;
}
inline bool CopyHideNumber(BYTE *m_p=NULL,UINT m_x=0){//更新数据
if(m_p==NULL||m_x==0)
return 0;
MyNumber_delete();
Length = m_x;
Number = new BYTE[Length+1];
HideNumber = new BYTE[Length+1];
memcpy(HideNumber,m_p,Length+1);
for(UINT i=0;i<Length;i++)
Number[i] = HideNumber[--m_x]+48;
Number[Length] = '\0';
return 1;
}
inline void MyNumber_zero(){//清零
MyNumber_delete();
Symbols = 0;
Length = 1;
Number = new BYTE[2];
HideNumber = new BYTE[2];
memset(HideNumber,0,2);
memset(Number,0,2);
Number[0] = '0';
}
inline void MyNumber_one(){//清理数据 赋值1
MyNumber_delete();
Length = 1;
Number = new BYTE[2];
HideNumber = new BYTE[2];
memset(HideNumber,0,2);
memset(Number,0,2);
Number[0] = '1';
HideNumber[0] = 1;
}
protected:
inline bool MyNumber_delete(){
if(Length){
Length = 0;
delete [] HideNumber;
delete [] Number;
return 1;
}
else
return 0;
}
inline bool MyNumber_create(BYTE *p){
if(Length){
Number = new BYTE[Length+1];
HideNumber = new BYTE[Length+1];
memcpy(Number,p,Length+1);
UINT m_i = Length;
for(int i=0;i<Length;i++)
HideNumber[--m_i] = Number[i]-48;
HideNumber[Length] = '\0';
return 1;
}
return 0;
}
inline void ChangeOver(BYTE *p,UINT m_x){//倒转数据
UINT m_i = m_x/2;
BYTE m_c;
for(int i=0;i<m_i;i++){
m_c = p[i];
p[i] = p[--m_x];
p[m_x] = m_c;
}
}
inline void ChangeOverCopy(BYTE *p1,BYTE*p2,UINT m_x){//倒转复制
UINT m_i = m_x;
for(int i = 0;i<m_x;i++)
p1[i] = p2[--m_i];
}
virtual BYTE * CheckChar(char *m_p){//检查数据
while(m_p[0]!='\0'){
if(m_p[0]=='0'||(m_p[0]<='0'&&m_p[0]>'9')){
m_p++;
continue;
}
else
break;
}
if(m_p=='\0')
return NULL;
int m_i = strlen(m_p);
BYTE *m_p_one = new BYTE[m_i+1];
memset(m_p_one,0,m_i+1);
for(int i=0,j=0;i<m_i;i++){
if(m_p[i]>='0'&&m_p[i]<='9'){
m_p_one[j] = m_p[i];
j++;
}
}
return m_p_one;
}
/*
inline bool MyNumberCToB(){
for(UINT i=0;i<Length;i++)
}*/
public:
UINT Symbols;
protected:
UINT Length;
private:
BYTE *Number;
BYTE *HideNumber;
};
#endif
一个简单的复数类,lz看下,如何实现operator+与operator+=
#include <iostream>
// 简单的复数类,为了方便,接口与实现放在一起
class myComplex
{
public:
// constructor
myComplex(int real = 0, int image = 0)
: real_(real), image_(image)
{}
// operator
myComplex& operator+= (const myComplex& other)
{
real_ += other.real_;
image_ += other.image_;
return *this;
}
// print
friend std::ostream& operator<< (std::ostream& os, const myComplex& content)
{
return os << content.real_ << " " << content.image_;
}
private:
int real_;
int image_;
};
// 注意返回值类型,这里lhs、rhs都是const
myComplex operator+ (const myComplex& lhs, const myComplex& rhs)
{
return myComplex(lhs) += rhs;
}
int main()
{
myComplex a(10, 20);
myComplex b(20, 40);
myComplex c = a + b;
// 这里a、b的值都不会变
std::cout << "c = " << c << std::endl;
std::cout << "a = " << a << std::endl;
std::cout << "b = " << b << std::endl;
return 0;
}