c++primer学习笔记2.pdf
《c++primer学习笔记2.pdf》由会员分享,可在线阅读,更多相关《c++primer学习笔记2.pdf(74页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、读 书 笔 记 2分 类:IT书 籍 读 书 笔 记 2012-0&27 16:46 1019人 阅 读 评 论(0)收 藏 举 报 C+读 书 d e l e t e i o s s t r i n g类 的 白 动 转 换 和 强 制 类 型 转 换 1)如 果 构 造 函 数 中 含 有 类 似 的 拷 贝 函 数:CStonewt(double lbs)(m_nStone=int(lbs)/Lbs_per_stn;m_fPdsJeft=int(lbs)%Lbs_per_stn+lbs-int(lbs);m_fPounds=lbs;)那 么 使 用 CStonewt myCat;myCa
2、t=19;程 序 将 使 用 构 造 函 数 CStonewt(double lbs)来 创 建 一 个 临 时 的 CStonewt对 象,并 将 19.6作 为 初 始 值。随 后,采 用 逐 成 员 赋 值 方 式 将 该 临 时 对 象 的 内 容 赋 值 到 myCat中(比 如 m_nStone=int(lbs)/Lbs_per_stn;)o这 一 过 程 称 为 隐 式 转 换,因 为 他 是 自 动 进 行 的,而 不 需 要 显 示 强 制 类 型 转 换。如 果 换 成 CStonewt(double lbs,int i)有 两 个 参 数,因 此 不 能 用 来 转 换
3、类 型。(cpp)view plaincopyprint?C1.#include stdafx.h2.#include iostream3.using namespace std;4.5.namespace6.7.class CStonewt8.9.public:10.CStonewt(double lbs)11.(12.m_nStone=int(lbs)/Lbs_per_stn13.m_fPds_left=int(lbs)%Lbs_per_+lbs-int(lbs);14.m_fPounds=lbs;15.16.CStonewt(int stn,double lbs)17.(18.m_nSt
4、one=stn;19.m_fPds_left=lbs;20.m_fPounds=stn*Lbs_per_stn+lbs21.22.CStonewt()23.24.m nStone=m fPounds=m fPds left:stn025.26.CStonewt()27.28.29.30.voids how_lbs()const(31.32.cout m_nStone stone m_fPds_left poundn endl;33.34.void show_stn()const35.36.cout m_fPounds poundn end1;37.38.private:39.enum Lbs_
5、per_stn=14;40.int m_nStone;41.double m_fPds_left;42.double m_fPounds;43.;44.45.46.int _tmain(int argc,_TCHAR*argv)47.48.CStonewt myCat;49.myCat=19;50.51.return 0;52.2)将 构 造 函 数 用 作 自 动 类 型 转 换 函 数 似 乎 是 一 项 不 错 的 特 性。不 过,当 程 序 员 拥 有 更 丰 富 的 C+经 验 时,将 发 现 这 种 自 动 也 行 并 非 总 是 合 乎 需 要 的,因 为 这 会 导 致 意 外
6、 的 类 型 转 换。因 此,最 新 的 C+实 现 新 增 了 一 个 关 键 字(explicit),用 来 关 闭 这 种 自 动 特 性。也 就 是 说,可 以 这 样 声 明 构 造 函 数:cpp view plaincopyprint?C1.explicit CStonewt(double lbs)卜 3.m_nStone=int(lbs)/Lbs_per_stn;4.m_fPds_left=int(lbs)%Lbs_per_stn+lbs-int(lbs);5.m_fPounds=lbs;6.但 此 时 仍 然 可 以 进 行 myCat=(CStonewt)19.5;强 制
7、类 型 转 换。3)把 CStonewt类 对 象 赋 值 给 int、double变 量 要 进 行 这 样 的 操 作 时,编 译 器 发 现 右 侧 是 CStonewt类 型,而 左 侧 是 int、double类 型,因 此 它 将 查 看 程 序 员 是 否 定 义 了 与 此 匹 配 的 转 换 函 数(如 果 没 有 找 到 这 样 的 定 义,编 译 器 将 生 成 错 误 消 息,指 出 无 法 将 CStonewt赋 给 int、double)如 果 想 要 使 用 这 种 转 换 函 数,要 转 换 为 typeName类 型,需 要 使 用 这 种 形 式 的 转 换
8、 函 数:operator typeName();注 意 以 下 几 点:a、转 换 函 数 必 须 是 类 方 法 b、转 换 函 数 不 能 指 定 返 回 类 型 c、转 换 函 数 不 能 有 参 数 htm I view plaincopyprint?C1.#include stdafx.h2.#include iostream3.using namespace std;4.5.namespace6.I?.class CStonewt8.9.public:11.10.explicit CStonewt(double lbs)23.12.m_nStone=int(lbs)/Lbs_pe
9、r_stn;13.m_fPds_left=int(lbs)%Lbs_per_stn+lbs-int(lbs);14.m_fPounds=lbs;15.16.CStonewt(int stn,double lbs)17.18.m_nStone=stn;19.m_fPds_left=lbs;20.m_fPounds=stn*Lbs_per_stn+lbs;21.22.CStonewt()28.24.m_nStone=m_fPounds=m_fPds_left=025.26.CStonewt()27.operator int()const29.return int(100.5);30.31.oper
10、ator double()const32.(33.return 999.5;34.35.private:36.enum Lbs_per_stn=14;37.int m_nStone;38.double m_fPds_left;39.double m_fPounds;40.;41.42.43.int _tmain(int argc,_TCHAR*argv)44.45.CStonewt myCat;46.myCat=(CStonewt)19.5;47.double fValue=myCat;48.int iValue=myCat;51.49.cout iValue is:iValue endl;5
11、0.cout fValue is:fValue endl;52.return 0;53.类 和 动 态 内 存 分 配 小 插 曲:strlen()返 回 字 符 串 长 度,但 不 包 括 末 尾 的 空 字 符,因 此 构 造 函 数 len+1,使 分 配 的 内 存 能 够 存 储 包 含 空 字 符 的 字 符 串 1)含 有 很 多 隐 藏 错 误 的 stringBad类 StringBad.h:(cpp view plaincopyprint?C1.#ifndef _STRINGBAD_H_2.#define _STRINGBAD_H_3.4.#include iostream
12、5.#include string6.using namespace std;7.8.class StringBad9.10.public:11.StringBad。;12.StringBad(const char*str);13.StringBad();14.15.friend ostream&operator(ostream&os,const StringBad&sb);16.private:17.char*m_str;18.int m_nLen;19.public:20.static int num_strings;21.;22.23.#endifString Bad.cpp:cpp v
13、iew plaincopyprint?C1.#include stdafx.h2.#include StringBad.h3.4.int StringBad:num_strings=0;5.6.StringBad:StringBad()7.8.m_nLen=4;9.m_str=new char 4;10.num_strings+;11.strcpy_s(m_str,strlen(C+)+1,C+);12.cout StringBad:num_strings:mstr object created endl;13.14.15.StringBad:StringBad(const char*str)
14、16.17.m_nLen=strlen(str);18.m_str=new char m_r)Len+1;19.num_strings+;20.strcpy_s(m_strJm_nLen+1,str);21.cout num_strings:m_str object created endl;22.23.24.StringBad:StringBad()25.26.if(m_str)27.28.delete m_str;29.30.num_strings-;31.cout in the StringBad:StringBad()num_strings is:num_strings endl;32
15、.33.34.ostream&operator(ostream&os,const StringBad&sb)35.36.os this StringBad str is:sb.m_str endl;37.os this StringBad len is:sb.m_nLen endl;38.return os;139.teststring Bad.cpp:cpp view plaincopyprint?C1.#include stdafx.h2.#include iostream3.using namespace std;4.#include StringBad.h5.6.void callme
16、l(StringBad&rStringBad)7.8.cout in the function callmel endl;9.cout in the function callmel rStringBad endl;10.11.12.void callme2(StringBad StringBad)13.14.cout in the function callme2 endl;15.cout in the function callmel StringBad endl;16.17.18.int _tmain(int argc,_TCHAR*argv)|19.20.StringBad headl
17、inel(Create headlinel);21.StringBad headline2(Create headline2);22.StringBad sport(Create sport);23.24.cout headlinel endl;25.cout headline2 endl;26.cout sport endl;27.28.callmel(headlinel);29.cout headlinel endl;30.callme2(headline2);31.cout headline2 endl;32.33.cout Initialize one object to anothe
18、r:endl;34.StringBad sailer=sport;35.cout sailer sailer endl;36.cout Assign one object to anther:endl;卜.38.StringBad knot;39.knot=headlinel;40.cout knot knot endl;41.cout End of main()endl;42.43.cout num_strings is:StringBad:num_strings endl;44.45.return 0;46.2)复 制 拷 贝 函 数 cpp view plaincopyprint?C1.
19、StringBad&StringBad:operator=(const StringBad&st)2.(3.if(this=&st)4.(5.return*this;6.)7.delete str;8.len=st.len;9.str=new char strlen(len+1);10.str:strcpy(str,st.str);11.return*this;12.3)重 写 下 标 运 算 符 cpp view plaincopyprint?C1.char&operator(int i)2.3.return m_str i;4.)5.const char&operator(int i)co
20、nst6.7.return m_str i;8.)为 什 么 要 提 供 两 个 版 本。原 因 是 m_str是 常 量,而 上 述 方 法 无 法 确 保 不 修 改 数 据。但 在 重 载 时,C+将 区 分 常 量 和 非 常 量 函 数 的 特 征 标,因 此 提 供 了 另 一 个 仅 供 const String对 象 使 用 的 operator。版 本 4)新 的 String类 cpp view plaincopyprint?C1.#include stdafx.h2.#include iostream3.#include string4.using namespace s
21、td;5.6.#define MAXTEMPSIZE 2567.8.class myString9.10.public:11.myString()12.13.m_nLen=4;14.m_str=new char m_nLen+1;15.strcpy_s(m_str,strlen(C+)+1,C+);16.num_string+;17.cout in the myString():endl;18.19.myString(char*str)20.21.m_nLen=strlen(str);22.m_str=new char m_nLen+1;23.strcpy_s(m_str,m_nLen+1,s
22、tr);24.num_string+;25.cout in the myString(char*str):endl;26.27.myString(const myString&rString)28.29.m_nLen=strlen(rString.m_str);30.m_str=new char m_nLen+1;31.strcpy_s(m_str,m_nLen+1,rString.m_str);32.num_string+;33.cout in the myString(const myString&rString):endl;34.35.myString()36.37.if(m str)3
23、8.39.cout this m str is:一 m_str endl;40.delete m_str;41.42.num_string-;43.cout in the myString():endl;44.45.static int HowMany()46.47.return num_string;48.49.inline int length()const50.51.return m_nLen;52.53.myString&operator=(const myString&rString)54.55.if(this=&rString)56.57.return*this;58.59.m_n
24、Len=rString.m_nLen;60.m_str=new char m_nLen+1;61.strcpy_s(m_str,m_nLen+1,rString.m_str);62.num_string+;63.cout in the myString&operator=(const myString&rString):endl;64.return*this;65.66.myString&operator=(const char*str)67.68.m_nLen=strlen(str);69.m_str=new char m_nLen+1;70.strcpy_s(m_str,m_nLen+1,
25、str);71.num_string+;72.cout in the myString&myString&operator=(const char*str):endl;73.return*this;74.)75.char&operator(int i)76.77.return m_str i;78.79.const char&operator(int i)const80.81.return m_str i;82.83.84.friend ostream&operator(istream&is,myString&rString);86.friend bool operator(const myS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- primer 学习 笔记
限制150内