1、iostream3. usingnamespacestd;4. 5. namespace6. 7. classCStonewt8. 9. public:10. CStonewt(doublelbs)11. 12. m_nStone=int(/Lbs_per_stn;13. m_fPds_left%Lbs_per_stn+-);14. m_fPoundslbs;15. 16. intstn,17. 18. stn;19. 20. stn*21. 22. CStonewt()23. 24. 0;25. 26. CStonewt()27. 28. 29. 30. voidshow_lbs()cons
2、t31. 32. coutstonepoundnendl;33. 34. show_stn()35. 36. 37. 38. private:39. enum14;40. m_nStone;41. m_fPds_left;42. m_fPounds;43. 44. 45. 46. int_tmain(intargc,_TCHAR*argv)47. 48. myCat;49. myCat19;50. 51. return52. 2)将构造函数用作自动类型转换函数似乎是一项不错的特性。不过,当程序员拥有更丰富的C+经验时,将发现这种自动也行并非总是合乎需要的,因为这会导致意外的类型转换。因此,最新
3、的C+实现新增了一个关键字(explicit),用来关闭这种自动特性。也就是说,可以这样声明构造函数:1. explicit2. 3. 5. 6. 但此时仍然可以进行myCat = (CStonewt)19.5;强制类型转换。3)把CStonewt类对象赋值给int、double变量要进行这样的操作时,编译器发现右侧是CStonewt类型,而左侧是int、double类型,因此它将查看程序员是否定义了与此匹配的转换函数(如果没有找到这样的定义,编译器将生成错误消息,指出无法将CStonewt赋给int、double)如果想要使用这种转换函数,要转换为typeName类型,需要使用这种形式的转换
4、函数:operator typeName();注意以下几点:a、转换函数必须是类方法b、转换函数不能指定返回类型c、转换函数不能有参数htmlexplicitCStonewt()operatorint()100.5double()999.541. 43. int44. 46. (CStonewt)19.5;47. fValueiValueis:52. 53. 类和动态内存分配 小插曲 : strlen()返回字符串长度,但不包括末尾的空字符,因此构造函数len + 1,使分配的内存能够存储包含空字符的字符串1)含有很多隐藏错误的stringBad类StringBad.h:1. #ifndef_
5、STRINGBAD_H_2. #define4. #include5. #includestring6. using8. classStringBad9. 10. public:StringBad();StringBad(char*strStringBad();friendostream&operator(os,StringBad&sb16. private:m_str;m_nLen;19. public:staticnum_strings;21. ;23. #endifStringBad.cpp:StringBad.h4. intStringBad:num_strings6. StringB
6、ad:StringBad()7. m_nLen4;m_strnewchar4;num_strings+;strcpy_s(m_str,strlen(C+1,objectcreated13. 15. StringBad:16. 1m_str,m_nLen,22. 24. StringBad:StringBad()25. ifdeletenum_strings-;inthe32. 34. ostream&35. osthissb.m_strlensb.m_nLenos;39. testStringBad.cpp:6. voidcallme1(rStringBadfunctioncallme110.
7、 12. voidcallme2(stringBad13. callme216. 18. int19. headline1(Createheadline1headline2(headline2sport(sportheadline1headline2sportInitializeonetoanother:sailersport;sailerAssignanther:knot;knotheadline1;knotEndofmain()44. 46. 2)复制拷贝函数1. StringBad&operator=st)if(=&st*this;6. str;st.len;str:strcpy(str
8、,st.str12. 3)重写下标运算符1. char&operatorim_str4. 5. constchar&8. 为什么要提供两个版本。原因是m_str是常量,而上述方法无法确保不修改数据。但在重载时,C+将区分常量和非常量函数的特征标,因此提供了另一个仅供const String对象使用的operator()版本4)新的String类3. #include4. using6. #defineMAXTEMPSIZE256myStringmyString()1,num_string+;myString():myString():myString&rStringrString.m_strmyString()num_string-;myString():HowMany()num_string;inlinelength()53. 54. 55.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1