[code=C/C++] #ifndef CHUA_H #define CHUA_H #include <string> #include <iostream> using namespace std; class CHua { public: //explicit规定这个构造函数必须显示调用,而不会被隐式的调用 //显式的static_cast<CHua>(char* ss)这样可以 //隐式的传参的时候,在后台变化(编译器自动执行),这样是不行的 explicit CHua(const char* rhs,int p=1){ int len=strlen(rhs); data=new char[len+1]; strcpy(data,rhs); this->num=p; } explicit CHua(int p){ data=new char[1]; data[0]='/0'; num=p; } //copy control(rule of 3 不能用explicit来指明,因为explicit意味着,const也不能自动转换了,会有很多的麻烦) CHua(const CHua& rhs){ data=new char[strlen(rhs.data)+1]; strcpy(data,rhs.data); num=rhs.num; } CHua& operator= (const CHua& rhs){ if( &rhs == this) //不给自己赋值,不然下面delete的时候,直接挂了 return *this; if(data) { delete[] data; data=NULL; } data=new char[strlen(rhs.data)+1]; strcpy(data,rhs.data); num=rhs.num; } ~CHua(){ if(!data) return ; delete [] data; data=NULL; } //牛逼,这种运算符必须用friend来重定义 //因为member中重载操作符的话,左操作数必须是this指针 //所以一般 数学运算符 和 << >> 这种operator都会被定义到friend类外去 //而对于返回值来说,若是返回值充当类似于内建变量的值,传value // 若是返回值还要用于后续被赋值,传reference& // 传回的value当其不愿意被粗暴赋值的时候,返回const value,即不会被(a*b)=c 这样粗暴赋值了 // 传回的reference若也是不愿意被改变指,const & //对于const作为参数来说,引用类型(*,&),一般都要用const,因为非const可以转成const型的引用类型,倒过来不行 // 值类型作为参数,const和非const没什么区别.因为都是局部变量,不改变真实值 //friend istream& operator>>(istream&,CHua&); friend ostream& operator<<(ostream&,const CHua&); friend const CHua operator* (const CHua&,const CHua&); //static void operator() (int a){ //调用操作符,就可以直接调用了 // return a+2; //class c; c(2)即可 //} int setLength(int p) const{ length=p; } private: char* data; int num; mutable int length; //mutable变量改变const function的效力. }; //istream& operator>>(istream& input,CHua& str){ // return input; // Todo //} ostream& operator<<(ostream& output,const CHua& str){ return output<<"str:"<<str.data<<"/t"<<"num:"<<str.num; } //另外若是返回CHua&就发生灾难了,理由是local variable被释放,CHua&是不确定乱指的引用. const CHua operator* (const CHua& lhs,const CHua& rhs){ return CHua(lhs.num*rhs.num); } #endif // CHUA_H [/code]