我们写程序的时候,常把成员变量,定义成为私有或保护的成员,然后添加存取该变量的函数。如下面的代码所示:
protected:
CString m_str;
public:
CString GetStr()
{
CString *pStr = new CString;
*pStr = m_str;
return *pStr; }
这样做的好处是可以防止数据成员从类的外部被修改,从而维护了类中的数据的安全。
若将其成员函数修改成:
CString GetStr()
{
return m_str;
}
这时,如果类的使用者在外部使用了如下的语句所示的强制类型转换,
CString& str = (CString&)pDoc->GetStr();
str = "字符串将被修改";
这样,则可以通过引用str来修改保护成员m_str的值,可以自己在SDI的应用程序中验证这一点。
但是,如果不使用强制类型转换将pDoc->GetStr()转换为CString&并把str定义为CString(而不是CString&)的话,修改str的值并不会,引起类中的保护成员m_str的值的改变.
还有使用,Const关键字修饰指针来返回指向私有或保护成员的指针也并不安全。例如,将GetStr()函数定义成如下的形式:
const CString* GetStr()
{
return (const CString*)&m_str;
}
那么,在类的外部,使用者同样也可以使用强制类型转换被声明为const的指针,从而修改私有成员m_str, 如下面的代码所示 :
CString *pStr = (CString*)pDoc->GetStr();
*pStr = "字符串将被修改";
同样也可以修改,私有或保护成员的数据内容,
具体,怎么样理解,怎么样实现的呢?这是个很小菜的问题了, 呵呵
protected:
CString m_str;
public:
CString GetStr()
{
CString *pStr = new CString;
*pStr = m_str;
return *pStr; }
这样做的好处是可以防止数据成员从类的外部被修改,从而维护了类中的数据的安全。
若将其成员函数修改成:
CString GetStr()
{
return m_str;
}
这时,如果类的使用者在外部使用了如下的语句所示的强制类型转换,
CString& str = (CString&)pDoc->GetStr();
str = "字符串将被修改";
这样,则可以通过引用str来修改保护成员m_str的值,可以自己在SDI的应用程序中验证这一点。
但是,如果不使用强制类型转换将pDoc->GetStr()转换为CString&并把str定义为CString(而不是CString&)的话,修改str的值并不会,引起类中的保护成员m_str的值的改变.
还有使用,Const关键字修饰指针来返回指向私有或保护成员的指针也并不安全。例如,将GetStr()函数定义成如下的形式:
const CString* GetStr()
{
return (const CString*)&m_str;
}
那么,在类的外部,使用者同样也可以使用强制类型转换被声明为const的指针,从而修改私有成员m_str, 如下面的代码所示 :
CString *pStr = (CString*)pDoc->GetStr();
*pStr = "字符串将被修改";
同样也可以修改,私有或保护成员的数据内容,
具体,怎么样理解,怎么样实现的呢?这是个很小菜的问题了, 呵呵
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货