📄 chap08.html
字号:
<P ALIGN="JUSTIFY"><LI>str="</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1>字符串将被修改</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>!"</LI></P></UL>
<DIR>
<DIR>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">则可以通过引用</FONT><FONT SIZE=3>str</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>来修改类中的保护性成员</FONT><FONT SIZE=3>m_str</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>的值,读者可以编写程序来自行验证这一点。</P>
<P ALIGN="JUSTIFY">但如果不使用强制类型转换将</FONT><FONT SIZE=3>pDoc->GetStr</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>转换为</FONT><FONT SIZE=3>CString&</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>并把</FONT><FONT SIZE=3>str</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>定义为</FONT><FONT SIZE=3>CString (</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>而不是</FONT><FONT SIZE=3>CString&)</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>的话,修改</FONT><FONT SIZE=3>str</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>并不会改变类中的保护成员</FONT><FONT SIZE=3>m_str</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>的值。</P></DIR>
</DIR>
<UL>
<P ALIGN="JUSTIFY"><LI>使用以</FONT><FONT SIZE=3>const</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>关键字修饰的指针来返回指向私有或保护性数据成员的指针也并不总是安全的。例如,若</FONT><FONT SIZE=3>GetStr</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>函数的定义如下:</LI></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>const CString* GetStr()</LI></P>
<P ALIGN="JUSTIFY"><LI>{</LI></P>
<P ALIGN="JUSTIFY"><LI> return (const CString*)&m_str;</LI></P>
<P ALIGN="JUSTIFY"><LI>}</LI></P></UL>
<DIR>
<DIR>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">那么,在类的外部,使用者同样可以使用强制类型转换被声明为</FONT><FONT SIZE=3>const</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>的指针,从而修改私有成员</FONT><FONT SIZE=3>m_str</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>,如下面的代码所示:</P></DIR>
</DIR>
<UL>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>CString *pStr=(CString *)pDoc->GetStr();</LI></P>
<P ALIGN="JUSTIFY"><LI>*pStr="</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1>字符串将被修改</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>!";</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>虽然我们不应该过多地使用这种强制类型转换,但是,在编写类的时候,还是要尽可能的避免可能出现这些不希望发生的事情,以免用户对类的不正当的使用导致某些意外的问题,如使类中的数据不再可用等。如果调用者对自己的所做不是很清楚的话,这很可能导致程序出错,并且难以被检查出来,因为很多的编程者</FONT><FONT SIZE=3> (</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>尤其是初学者</FONT><FONT SIZE=3>) </FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>一般不容易想到问题的根源出在类的内部,尽管这种问题是由于错误的使用类造成的。</LI></P></UL>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">与添加读取文档数据的公有函数相似,我们还可以添加设置文档数据的公有成员函数,如下面的代码所示:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>public:</P>
<P>	int SetStr(const CString& NewStr)</P>
<P>	{</P>
<P>		m_str=NewStr;</P>
<P>	}</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">使用公有成员函数来存取类中的数据的一个最大的好处在于可以验证用户所传递的数据的有效性。从而避免用户把一个非法的数据赋给类的成员变量,这有可能在后面的使用中导致意外的问题。</P>
</FONT><FONT FACE="Arial"><P>8.3.3 </FONT><FONT FACE="黑体" LANG="ZH-CN">串行化数据</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">在</FONT><FONT SIZE=3>Visual C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>术语中,我们把对象的保存到永久介质中或从永久介质中读取对象称作串行化。串行化的基本观点是每一个对象都应该能够将自身的当前数据保存到永久介质中,这些数据一般由其成员变量所提供;在需要的时候,对象还应该能够从永久介质中读出所保存的数据,并用这些数据来重建该对象。在本节中,我们只讨论最基本串行化操作,在</FONT><FONT SIZE=3> “8.3.5 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>串行化对象</FONT><FONT SIZE=3>” </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>一节中描述了串行化对象和生成可串行化对象所需要的附加信息。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><A NAME="_954022525"></A><IMG SRC="Image338.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image338.gif" WIDTH=440 HEIGHT=359></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>8.7 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>保存文件时的串行化过程</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">在文档</FONT><FONT SIZE=3>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构实现中,串行化一般是重载文档对象的</FONT><FONT SIZE=3>Serialize</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数。在</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>创建应用程序框架的时候,生成了一个</FONT><FONT SIZE=3>Serialize</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>重载函数的框架,如下面的代码所示:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>void CExampleDoc::Serialize(CArchive& ar)</P>
<P>{</P>
<P>	if (ar.IsStoring())</P>
<P>	{</P>
<P>		// TODO: add storing code here</P>
<P>	}</P>
<P>	else</P>
<P>	{</P>
<P>		// TODO: add loading code here</P>
<P>	}</P>
<P>}</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">图</FONT><FONT SIZE=3>8.7</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>描述了保存文档时的串行化过程。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><A NAME="_954022771"></A><IMG SRC="Image339.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image339.gif" WIDTH=363 HEIGHT=243></P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -