C++类的运算符重载

来源:互联网 发布:湖南广电网络董事长 编辑:程序博客网 时间:2024/05/17 01:41

首先我们要注意哪些运算符可以被重载哪些不可以。


Int类的一些实现:

#include<iostream>using namespace std;#if 1class Int{private:int data;public:Int(int d = 0):data(d){}~Int(){}public:Int operator-(const Int &t){return Int(data-t.data);}Int operator+( Int &t){return Int(data+t.data);}Int operator*(const Int &t){return Int(data*t.data);}Int operator/(const Int &t){if(t.data!=0)return Int(data/t.data);}Int operator%(const Int &t){if(t.data!=0)return Int(data%t.data);}Int& operator+=(const Int &t){return Int(data += t.data);}Int& operator-=(const Int &t){return Int(data -= t.data);}Int& operator*=(const Int &t){return Int(data *= t.data);}Int& operator/=(const Int &t){if(t.data!=0)return Int(data /= t.data);}Int& operator%=(const Int &t){if(t.data!=0)return Int(data %= t.data);}Int& operator++()//++x{data++;return *this;}Int& operator++(int)//x++{Int tmp = *this;data++;return tmp;}///////////////////////////////////重点/////////////////////////operator int()const//重载类型转换//{return data;}};int main(){Int t1(10);Int t2(13);Int t4(0);Int t3;t3 = t1+t2;//相当于t1.operator(t2);//t1把它个给this指针,然后指针去调用成员函数。//所以我们看到的类中成员函数总比非类参数少一个。t3 = t1/t4;t3 = t1-t2;t1+=t2;t3 = t1+10;/*为什么c1+10要先调用构造函数???答:因为编译器可以先将10传给构造函数构造个了临时对象(恰恰构造函数也有了一个根据一个整数去构造的构造函数)相当于将10强转为XX类。(隐式转换)但如果在构造函数前加了(explicit)——明确的,显示的。则无法编译通过,【不允许隐式转换,只能显式转换】*///t3 = 10+t1;int val = t1;cout<<val<<endl;//调用了t1强转为int的重载函数。}#endif

String 类的一些实现:

class String;ostream& operator<<(ostream &out,const String &t);class String{private:char *data;public:String(char *dt = ""){if(dt == NULL){data = new char[strlen(dt)+1];data[0] = '\0';}else{//data = (char*)malloc((strlen(dt)+1)*sizeof(char));data = new char[strlen(dt)+1];strcpy(data,dt);}}String(const String &s){//data = (char*)malloc((strlen(s.data)+1)*sizeof(char));data = new char[strlen(s.data)+1];strcpy(data,s.data);}~String(){//cout<<"调用了"<<endl;delete[]data;}public:/*赋值的拷贝构造需要对原先的内存进行判断:如果不是自己给自己赋值要显示放掉原先的东西。   (对于指针来说!!!)   */  /*  有问题!!!要把原先的内存先释放掉。。。  (但是要注意当data不是指针的时候不需要释放掉)   String& operator=(String &p){data = (char*)malloc((strlen(p.data)+1)*sizeof(char));strcpy(data,p.data);return *this;}  */String& operator=(String &t);//operator=必须是成员函数。friend ostream& operator<<(ostream&,const String &t);String operator+(String &t);String& operator+=(String &t);char& operator[](size_t index);};char& String::operator[](size_t index){static char sNULL = '\0';if(index<strlen(data) && index>0){return data[index];}else{cout<<"下标越界";return sNULL;}}String& String::operator+=(String &t){char *temp;temp = new char[strlen(data)+strlen(t.data)+1];strcpy(temp,data);strcat(temp,t.data);delete []data;data = temp;return *this;}String String::operator+(String &t){String temp;int len;len = strlen(data)+strlen(t.data)+1;delete[]temp.data;temp.data = new char[len];//注意这条语句不能少!!!否则再返回的时候会有错。strcpy(temp.data,data);strcat(temp.data,t.data);return temp;}String& String::operator=(String &t){if(this != &t)//避免自己给自己赋值{delete []data;data = new char[strlen(t.data)+1];strcpy(data,t.data);}return *this;}ostream& operator<<(ostream &out,const String &t){out<<t.data;return out;}int main(){String str("Hello");String str1(str);String str2;str2 = str1;String str3;str3 = str1+str2;cout<<str1<<"  "<<str2<<"  ";cout<<endl;cout<<str3<<endl;str3+=str1;cout<<str3<<endl;cout<<str3[4]<<endl;cout<<str2[6];return 0;}#endif




1 0