我们写程序的时候,常把成员变量,定义成为私有或保护的成员,然后添加存取该变量的函数。如下面的代码所示:
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 = "字符串将被修改";
同样也可以修改,私有或保护成员的数据内容, 
  具体,怎么样理解,怎么样实现的呢?这是个很小菜的问题了, 呵呵