编写strcpy函数和类String的构造函数、析构函数、赋值函数和重载运算符函数

上传人:枫** 文档编号:503552411 上传时间:2023-10-22 格式:DOC 页数:8 大小:48.50KB
返回 下载 相关 举报
编写strcpy函数和类String的构造函数、析构函数、赋值函数和重载运算符函数_第1页
第1页 / 共8页
编写strcpy函数和类String的构造函数、析构函数、赋值函数和重载运算符函数_第2页
第2页 / 共8页
编写strcpy函数和类String的构造函数、析构函数、赋值函数和重载运算符函数_第3页
第3页 / 共8页
编写strcpy函数和类String的构造函数、析构函数、赋值函数和重载运算符函数_第4页
第4页 / 共8页
编写strcpy函数和类String的构造函数、析构函数、赋值函数和重载运算符函数_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《编写strcpy函数和类String的构造函数、析构函数、赋值函数和重载运算符函数》由会员分享,可在线阅读,更多相关《编写strcpy函数和类String的构造函数、析构函数、赋值函数和重载运算符函数(8页珍藏版)》请在金锄头文库上搜索。

1、编写strcpy函数和类String的构造函数、析构函数、赋值函数和重载运算符函数已知strcpy函数的原型是char*strcpy(char*strDest,constchar*strSrc);其中strDest是目的字符串,strSrc是源字符串。(1) 不调用C+/C的字符串库函数,请编写函数strcpychar*strcpy(char*strDest,constchar*strSrc);/将源字符串加const,表明其为输入参数assert(strDest!=NULL)&(strSrc!=NULL);/2分/对源地址和目的地址加非0断言char*address=strDest;/2分/

2、为了实现链式操作,将目的地址返回he(*strDest+=*strSrc+)/2分NULL;returnaddress;/2分(2) strcpy能把strSrc的内容复制到strDest,为什么还要char*类型的返回值?答:为了实现链式表达式。/2分例如intlength=strlen(strcpy(strDest,“helloworld”);二、网上广泛流传的,也是摘自林锐的题目:已知strcpy函数的原型是:char*strcpy(char*strDest,constchar*strSrc);1. 不调用库函数,实现strcpy函数。2. 解释为什么要返回char*。解说:1.strc

3、py的实现代码char*strcpy(char*strDest,constchar*strSrc)if(strDest=NULL)|(strsrc=/=NULL)/1(我感觉应为)throwInvalidargument(s);/2char*strDestCopy=strDest;/3while(*strDest+=*strSrc+)!=0);/4returnstrDestCopy;错误的做法:1(A) 不检查指针的有效性,说明答题者不注重代码的健壮性。(B) 检查指针的有效性时使用(!strDest)|(!strSrc)或(!(strDest&strSrc),说明答题者对C语言中类型的隐式转

4、换没有深刻认识。在本例中char*转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。所以C+专门增加了bool、true、false三个关键字以提供更安全的条件表达式。(C) 检查指针的有效性时使用(strDest=o)|(strsrc=/=o),说明答题者不知道使用常量的好处。直接使用字面常量(如本例中的0)会减少程序的可维护性。0虽然简单,但程序中可能出现很多处对指针的检查,万一出现笔误,编译器不能发现,生成的程序内含逻辑错误,很难排除。而使用NULL代替0,如果出现拼写错误,编译器就会检查出来。2(A) returnnewstring(Inval

5、idargument(s);,说明答题者根本不知道返回值的用途,并且他对内存泄漏也没有警惕心。从函数中返回函数体内分配的内存是十分危险的做法,他把释放内存的义务抛给不知情的调用者,绝大多数情况下,调用者不会释放内存,这导致内存泄漏。(B) return0;,说明答题者没有掌握异常机制。调用者有可能忘记检查返回值,调用者还可能无法检查返回值(见后面的链式表达式)。妄想让返回值肩负返回正确值和异常值的双重功能,其结果往往是两种功能都失效。应该以抛出异常来代替返回值,这样可以减轻调用者的负担、使错误不会被忽略、增强程序的可维护性。3(A)忘记保存原始的strDest值,说明答题者逻辑思维不严密。4(

6、A) 循环写成while(*strDest+=*strSrc+);,同1(B)。(B) 循环写成while(*strSrc!=0)*strDest+=*strSrc+;,说明答题者对边界条件的检查不力。循环体结束后,strDest字符串的末尾没有正确地加上0。2.返回strDest的原始值使函数能够支持链式表达式,增加了函数的附加值”同样功能的函数,如果能合理地提高的可用性,自然就更加理想。链式表达式的形式如:intiLength=strlen(strcpy(strA,strB);又如:char*strA=strcpy(newchar10,strB);返回strSrc的原始值是错误的。其一,源

7、字符串肯定是已知的,返回它没有意义。其二,不能支持形如第二例的表达式。其三,为了保护源字符串,形参用const限定strSrc所指的内容,把constchar*作为char*返回,类型不符,编译报错。类似的我们可以写出一个10分的strlen函数intstrlen(constchar*str)/输入参数constassert(strt!=NULL);/断言字符串地址非0intlen;while(*str+)!=0)len+;returnlen;include#includeusingnamespacestd;/已知类String的原型为:classStringpublic:String(con

8、stchar*str=NULL);/普通构造函数String(constString&other);/拷贝构造函数String(void);/析构函数String&operator=(constString&other);/赋值函数String&operator+(constString&other);/重载运算符+String&operator-(constString&other);/重载运算符-booloperator=(constString&other);/重载=,判断两个字符串相等booloperator(constString&other);friendostream&opera

9、tor(ostream&,constString&);重载m_data)+strlen(other.m_data);m_data=newcharlength+1;if(m_data!=NULL)strcpy(m_data,temp);strcat(m_data,other.m_data);return*this;String&String:operator-(constString&other)char*temp,*p;if(temp=strstr(m_data,other.m_data)=NULL)cout没有符合的子串,不能使用-操作endl;return*this;elsep=temp;

10、temp=temp+strlen(other.m_data);strcat(m_data,temp);return*this;/重载运算符ostream&operator(ostream&output,constString&other)outputother.m_data;returnoutput;boolString:operator(constString&other)if(strcmp(m_data,other.m_data)(constString&other)if(strcmp(m_data,other.m_data)0)returntrue;returnfalse;boolStr

11、ing:operator=(constString&other)if(strcmp(m_data,other.m_data)=0)returntrue;returnfalse;voidmain()Strings1(Hello,);Strings2(World!);StringS3(S2);调用拷贝构造函数Strings4(s2);StringS5(Hello,World);StringS6(Hello,World!);StringS7(Hello,World!);StringS8(o,W);StringS9;/StringS3;调用构造函数中的默认构造./S3=S2;/调用重载后的赋值函数coutS1endl;coutS2endl;coutS3endl;S3=S1+S2

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号