想彻底了解运算符重载,其他的如函数重载,继承,多态都已经有所了解!看了一些运算符重载的例子,总觉得不是简化,反而是让代码变得不清

hongzm 2004-12-04 05:57:09
看书上的函数重载例子,基本能看到,但不知道为什么那样做,因为我觉得很繁琐,也容易理解!不明白WHY?
还有就是特别想知道运算符重载的实际应用!分不够再加~~希望能举出一些例子,先谢谢了~!
...全文
323 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
UDX协议 2004-12-05
  • 打赏
  • 举报
回复
不好意思,引入我以前的部分源码,确给大家造成了误会。

dynamic_cast 是很有用的,他不是强制转换。
具体的可以看msdn,讲的很详细。


class CThing //这是其中一个基类
{
public:
HTREEITEM InitTree(CTreeCtrl &_tree,HTREEITEM _hti);
CThing();
virtual ~CThing();
public:
virtual void LoadMenuItems(CMenu *_pMenu);
virtual BOOL CanChangeProperty();
virtual void Property();
void ClearThings();
CThing& operator = (CThing& other);
virtual void Copy(CThing* _pThing);
virtual CThing* AllocalNode();//必须实现
virtual BOOL IsHaveNode(CThing *_pThing);
virtual void AddNode(CThing *_pThing);
virtual void DeleteNode(CThing *_pThing);
virtual void PopMenu( CPoint point);
THINGTYPE m_thingtype;//事类型
string m_commen;//备注
string m_title;//外在的名字
SYSTEMTIME m_timeCreate;//创建时间
SYSTEMTIME m_timeLastModi;//修改时间
list<CThing*> m_things;
};

#include "DpLpChange.h"
class CRectTracker;
class CMapView;
class CNodeTracker : public CRectTracker
{

public:
enum NODETYPE
{
NODEBASE = 0,
POLICE,
LABLE,
POLICE_FJ,
POLICE_OFFICE
}m_nodeType;
public:
CNodeTracker();
virtual ~CNodeTracker();
public:
virtual BOOL LbClk();
virtual void DbClk();
virtual void CopyData(CNodeTracker *_pNode);
virtual void DrawFouceEllipse(CDC *pDC,CRect _rect,COLORREF crFocus = RGB(255,0,0));
virtual void Serialize(CArchive& ar);
virtual void DrawSmall(CDC* pDC,CRect rect) ;
virtual void Draw(CDC* pDC) ;
virtual CString GetToolTipText();
virtual BOOL PropertyDlg(BOOL bCanChanged = false);

public:
virtual void ReDraw();
COLORREF GetClrBorder();
COLORREF GetClrFore();
COLORREF GetClrBk();
COLORREF GetClrSmall();
void SetClrBorder(COLORREF clBorder);
void SetClrFore(COLORREF clFore);
void SetClrBk(COLORREF clBk);
void SetClrSmall(COLORREF clSmall);
BOOL IsSelected();
BOOL Track(CWnd* pWnd, CPoint point);
BOOL SetCursor(CWnd* pWnd, UINT nHitTest) ;
void Selected(BOOL _bSelected = true);
void EnableMove(BOOL bMove = true);
void EnableChangeSize(BOOL bEnable = true);
void SetPosition(CPoint _point);
void SetPosition(CRect _rect);
void SetSize(int cx,int cy);
void SetSize(CSize _size);
void SetTrackerView(CWnd * _pView);
void GetInvaliteRect(CRect &_invaliteRect);
CSize GetSize();
CNodeTracker &operator = (CNodeTracker&other);


protected:
virtual void DrawTrackerRect(LPCRECT lpRect, CWnd* pWndClipTo,
CDC* pDC, CWnd* pWnd);
virtual void OnChangedRect(const CRect& rectOld);
BOOL TrackHandle(int nHandle, CWnd* pWnd, CPoint point, CWnd* pWndClipTo);

protected:
CMapView * m_pView;
CSize m_size;
BOOL m_bEnableChangeSize;
BOOL m_bEnableMove;
BOOL m_bSelected;
BOOL m_bMoved;
COLORREF m_crBk;
COLORREF m_crFore;
COLORREF m_crSmall;
COLORREF m_crBorder;


};

class CEventObject : public CThing,public CNodeTracker;
{....
}

m_pParentObject = other.m_pParentObject;中的m_pParentObject是为指向父类的指针,
我在实现对象的cpy的时候,用的,因为,指针是不能cpy的,这样,相当于,类之间的关系发生错误。

tseny 2004-12-05
  • 打赏
  • 举报
回复
多写点程序,多用一些还不熟的特征
11308narnar 2004-12-05
  • 打赏
  • 举报
回复
因为你现在只是学习书上的理论,没有深入到编程的实践中去。
所以,不知道在什么场合运用。
uoyevoli 2004-12-05
  • 打赏
  • 举报
回复
运算符重载,本身就是个“语法糖”,至于会不会简化你的使用,要看用在什么场合,怎么重载了。

比如CString的+运算符就很好,你可以方便地连接两个字符串。
但是,如果你重载CString的-运算符来作字符串连接,那只能让你的程序更难懂!

要注意,你在写运算符重载时,可能很累,代码比较麻烦,但是,请记住,一个类可能只写一次,但会被使用N次,所以与其每次用到时都重写一遍代码,还不如在写这个类的时候就把运算符重载了!!!
UDX协议 2004-12-05
  • 打赏
  • 举报
回复
如果在多继承中把指针强制转换,那么在很多情况,并不能产生正确的结果,因为,this指针,已经发生变化。它不能指向正确的对象指针,除非你知道当前的一个32位的值是一个明确的类对象(你知道就是它),否则,会产生不可预料的结果。

而用dynamic_cast 可以避免这种情况,在不是指向你期望的对象时,返回NULL。
hongzm 2004-12-04
  • 打赏
  • 举报
回复
up
OverlordBlind 2004-12-04
  • 打赏
  • 举报
回复
呵呵,你看的书太老了,C++ 94,95年时就做了大扩展,主要增加了模板,
引入了范型编程的概念,顺带增加了些类型转换和其他一些关键字,
我说的不是书名,但这类书很多,google上搜搜吧
OverlordBlind 2004-12-04
  • 打赏
  • 举报
回复
wwwllg(wwwllg)兄也不把例子写全了,
不知那个m_pParentObject是个什么东西
InitParent ? 如果CEventObject是另一个类的成员,用于存储事件,难道InitParent
能替一个事件(CEventObject)产生一个父?(CParentObject??)
hongzm 2004-12-04
  • 打赏
  • 举报
回复
偶看得每本书上都没有讲这个的啊!~!:)
C++基础教程,书是叫这个名吗?我搜搜!?
或者,你知道哪里有电子版或教程吗?
OverlordBlind 2004-12-04
  • 打赏
  • 举报
回复
dynamic_cast 是c++中建议使用的强制类型转换关键字,
CNodeTracker *pNode1 = dynamic_cast<CNodeTracker*>(this);
相当于CNodeTracker *pNode1 = (CNodeTracker*)(this);
看起来挺难看的,用C++之父的话说就是为了让你用着时感到难受
从而减少使用类型强制转换,因为有时类型强制转换会带来意想不到的错误

楼主应该先看看新的C++基础教程,对c++语法先有个了解
hongzm 2004-12-04
  • 打赏
  • 举报
回复
dynamic_cast<CThing *>(this);
dynamic_cast是否是一个宏?尖括号是什么意思呢?在宏里定义的?
还有ASSERT(pThing1)里的pThing会是什么值呢?NULL即是假?其他为真?

m_pParentObject = other.m_pParentObject;为什么不能有这句呢?
hongzm 2004-12-04
  • 打赏
  • 举报
回复
说实话,看不懂;(
CEventObject& CEventObject::operator = (CEventObject& other) //这是声明一个返回CEventObject类的引用的重载=号的函数,参数是CEventObject类的引用??//是这样吗?
以下得就看不懂了,很多关键字都没有,书上也没有!:(唉~
UDX协议 2004-12-04
  • 打赏
  • 举报
回复
这是没有重复基类的重载。
如果有更复杂的继承,那么,重载的时候要特别小心。
有时候编译通过,但实际上不一定是对的 。
只有在特定情况下,引发不可预料的结果,所以,多继承重载要慎重。
UDX协议 2004-12-04
  • 打赏
  • 举报
回复
给一个多继承的重载sample.
CEventObject& CEventObject::operator = (CEventObject& other)
{
CThing * pThing1 = dynamic_cast<CThing *>(this);
CThing * pThing2 = dynamic_cast<CThing *>(&other);
ASSERT(pThing1);
ASSERT(pThing2);
*pThing1 = *pThing2;
CNodeTracker * pNode1 = dynamic_cast<CNodeTracker *>(this);
CNodeTracker * pNode2 = dynamic_cast<CNodeTracker *>(&other);
ASSERT(pNode1);
ASSERT(pNode2);
*pNode1 = *pNode2;
m_eventtype = other.m_eventtype;
InitParent();
// m_pParentObject = other.m_pParentObject;不能有这句,是个陷阱

return * this;
}
auly403 2004-12-04
  • 打赏
  • 举报
回复
存在就有它的道理.
这个例子是很难说得明白,现在俺在做一个程序,为了简化代码和增加可读性,不得不用重载运算符,

到要你的时候,你自然知道为什么,
HEHE
hongzm 2004-12-04
  • 打赏
  • 举报
回复
好象有那么一点理解了!!只是还不知道能在哪方面马上用到他~除了+和<<这些,偶指自己写得
qrlvls 2004-12-04
  • 打赏
  • 举报
回复
实际上操作符的重载确确实实简化了很多操作,至少更直观的表述了一些观点,这与对象的实际性质相关,只要不滥用,为何不用呢
danielzhu 2004-12-04
  • 打赏
  • 举报
回复
UP
oyljerry 2004-12-04
  • 打赏
  • 举报
回复
有时需要我们自己重载运算符的
比如,你定义了一个自己的结构体,你希望能实现结构体的相加,这是就需要重载运算符
operator+
hongzm 2004-12-04
  • 打赏
  • 举报
回复
还是不太明白!:(,简化?可不可以举个例子呢?
加载更多回复(6)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧