str=new char[size+1]; strcpy_s(str,size+1,m); }
//(8)定义析构函数 String::~String() { delete [] str; size=0; }
//(9)定义运算符<<重载函数
ostream&operator<<(ostream&output,String&s) { output< //(10)定义运算符>>重载函数 istream&operator>>(istream&input,String&s) { char temp[1000]; input>>temp; delete [] s.str; s.size=strlen(temp); s.str=new char[s.size+1]; strcpy_s(s.str,s.size+1,temp); return input; } //(11)定义int类型转换函数 String::operator int()const { return size; } //(12)定义char*类型转换函数 String::operator char* () const { static char temp[1000]; strcpy_s(temp,\ strcat_s(temp,str); strcat_s(temp,\ return temp; } int main() { char s[100]; String s1,s2; //(13)调用构造函数 cout<<\ cin>>s1>>s2; /(14)/调用operator>>函数 cout<<\ cout<<\//(15)调用operator<<函数 cout<<\//(16)调用operator int类型转换函数 cout<<\//(17)调用operator char*类型转换函数 cout<<\//(18)调用operator char*类型转换函数 strcpy(s,s2); //(19)对参数s2调用类型转换函数operator char*,然后调用库函数 cout<<\//(20)调用库函数输出串 return 0; //(21)调用析构函数 } 综合练习 一、思考题 1.一个运算符重载函数被定义为成员函数或友元函数后,在定义方式、解释方式和调用方式上有何区别?可能会出现什么问题?请用一个实例说明之。 【解答】 以二元运算符为例。 运算符重载 成员函数 Obj& operator op(); Obj operator op(object); Obj.operatorop() ObjL.operator op(ObjR) Obj op 或opObj ObjLopObjR 左操作数通过this指针指定,右操作数由参数传递 友员函数 friend Obj& operator op(Obj&); friend Obj operator op(Obj,Obj); operator op(Obj) operator op(ObjL,ObjR) Objop或 opObj ObjLopObjR 操作数均由参数传递 定义 解释 调用 可能会出现的问题: (1)运算符的左右操作数不同,须用友员函数重载; (2)当运算符的操作需要修改类对象状态时,应用成员函数重载。 (3)友员函数不能重载运算符 = () [] -> 必须要用友员函数重载的运算符>><< 程序略。 2.类类型对象之间、类类型和基本类型对象之间用什么函数进行类型转换?归纳进行类型转换的构造函数和类型转换函数的定义形式、调用形式和调用时机。 【解答】 构造函数可以把基本类型、类类型数据转换成类类型数据;类类型转换函数可以在类类型和基本数据类型之间做数据转换。 构造函数 类类型转换函数 定义形式 ClassX::ClassX(arg,arg1=E1,...,argn=En); ClassX::operator Type(); 调用形式 隐式调用 用类型符显式调用; 自动类型转换时隐式调用 调用时机 建立对象、参数传递时 需要做数据类型转换时