关于MFC成员函数参数表的纳闷——是输入参数?OR 输出参数
关于MFC成员函数参数表的疑惑——是输入参数?OR 输出参数?
void CTextView::OnDraw(CDC* pDC)函数中的参数:CDC* pDC 是输入参数,还是输出参数?这个问题我搞不明白。我最初理解是输出参数,即给用户返回一个指针用于作图或输出文字。但这又与传统的函数定义相违背,我们所学的C语言定义中函数括号中的内容要么是形参表,要么在调用时是实参,用于传入给这个函数,替换形参,最终实现函数的功能,所以在C语言中函数的参数肯定是输入参数,不可能是输出参数的。如 compare(int x, int y ),x,y均作为输入参数。
这里的CDC* pDC 我还有一种想法是,它作为OnDraw的输入参数,只不过此函数的输入参数是一个CDC对象的指针,CDC对象自己有它的成员变量和成员方法,将一个对象作为参数传给我们所定义的视类CxxView所成员函数,最终通过成员函数OnDraw实现在窗口尺寸发生变化时,更新窗口内显示内容的功能。要按这种思路CDC* pDC 还是做为输入参数的,即作为实参输入给函数。不清楚我的理解是否正确?
如果CDC* pDC是作为输入参数,那新的问题又来了:
void CTextView::OnLButtonDown(UINT nFlags, CPoint point) 是处理鼠标左键按下消息的成员函数,这个成员函数中的参数point,它表是鼠标当前点所在的屏幕坐标位置,是程序从它的消息队列中获取的,它作为返回值给用户,用户可以基于这个坐标进行相关的操作,如改变光标显示的位置到当前点。但这个输出参数竟然写在了函数的参数列表中了(UINT nFlags, CPoint point) ,即写在函数名后的括号中,这完全与C语言函数的定义相违背。因为C语言中函数的参数表全部是输入参数,没有输出参数的,而这个成员函数中的point参数 竟然是一个输出参数放在这 , 这是为什么? 完全晕了。
多谢!
------解决思路----------------------
void CTextView::OnDraw(CDC* pDC)函数中的参数:CDC* pDC 主要是输入参数,同时也是输出参数。
作为输入参数,你可以用它,
作为输出参数,你可以改变它的属性,但你不能 release 它。
------解决思路----------------------
太长了,我只看了一点。
不知道你从哪本书上看到的“输入参数”“输出参数”的概念,这些都不规范,c++基本的语法跟c是一样的,函数只有函数参数和返回值,不要纠结于“输入参数”“输出参数”。
你弄晕的原因应该是你没了解MFC的框架。你建一个mfc的工程,实际上微软已经给你搭了一个框架。
比如你说的OnLButtonDown函数,如果需要在鼠标左键按下时做一些操作,你就重写OnLButtonDown函数(重写明白否?)当系统捕捉到左键按下消息时,框架会调用你写的OnLButtonDown函数,并且把鼠标按下时的点坐标传递给你。你是不是认为系统把点坐标告诉你就是向你“输出参数”?
------解决思路----------------------
楼主的意义,微软应该这样定义这个函数:
void CTextView::OnDraw(const CDC* pDC)
目前大部分的代码都不加const,因此,你可以误解成是可以修改的,其实是不能修改的。这些根本就不是输出参数,如果是输出参数,一般MSDN里面会明确提示你。
把参数加const,可以有效的防止别人修改,但是其实没什么用,因为C/C++太灵活了。const可以强制转换成非const的,所以加不加都没啥意义。
------解决思路----------------------
"后面的void CTextView::OnLButtonDown(UINT nFlags, CPoint point) 中的point参数呢"
void 说明函数 OnLButtonDown 没有返回值。
而 (UINT nFlags, CPoint point)是输入参数,但通常你不能改(改了也没用,因为是‘值’传递)。
只有 指针传递的参数 有可能 既是输入,又是输出(可以改)
void CTextView::OnDraw(CDC* pDC)函数中的参数:CDC* pDC 是输入参数,还是输出参数?这个问题我搞不明白。我最初理解是输出参数,即给用户返回一个指针用于作图或输出文字。但这又与传统的函数定义相违背,我们所学的C语言定义中函数括号中的内容要么是形参表,要么在调用时是实参,用于传入给这个函数,替换形参,最终实现函数的功能,所以在C语言中函数的参数肯定是输入参数,不可能是输出参数的。如 compare(int x, int y ),x,y均作为输入参数。
这里的CDC* pDC 我还有一种想法是,它作为OnDraw的输入参数,只不过此函数的输入参数是一个CDC对象的指针,CDC对象自己有它的成员变量和成员方法,将一个对象作为参数传给我们所定义的视类CxxView所成员函数,最终通过成员函数OnDraw实现在窗口尺寸发生变化时,更新窗口内显示内容的功能。要按这种思路CDC* pDC 还是做为输入参数的,即作为实参输入给函数。不清楚我的理解是否正确?
如果CDC* pDC是作为输入参数,那新的问题又来了:
void CTextView::OnLButtonDown(UINT nFlags, CPoint point) 是处理鼠标左键按下消息的成员函数,这个成员函数中的参数point,它表是鼠标当前点所在的屏幕坐标位置,是程序从它的消息队列中获取的,它作为返回值给用户,用户可以基于这个坐标进行相关的操作,如改变光标显示的位置到当前点。但这个输出参数竟然写在了函数的参数列表中了(UINT nFlags, CPoint point) ,即写在函数名后的括号中,这完全与C语言函数的定义相违背。因为C语言中函数的参数表全部是输入参数,没有输出参数的,而这个成员函数中的point参数 竟然是一个输出参数放在这 , 这是为什么? 完全晕了。
多谢!
------解决思路----------------------
void CTextView::OnDraw(CDC* pDC)函数中的参数:CDC* pDC 主要是输入参数,同时也是输出参数。
作为输入参数,你可以用它,
作为输出参数,你可以改变它的属性,但你不能 release 它。
------解决思路----------------------
太长了,我只看了一点。
不知道你从哪本书上看到的“输入参数”“输出参数”的概念,这些都不规范,c++基本的语法跟c是一样的,函数只有函数参数和返回值,不要纠结于“输入参数”“输出参数”。
你弄晕的原因应该是你没了解MFC的框架。你建一个mfc的工程,实际上微软已经给你搭了一个框架。
比如你说的OnLButtonDown函数,如果需要在鼠标左键按下时做一些操作,你就重写OnLButtonDown函数(重写明白否?)当系统捕捉到左键按下消息时,框架会调用你写的OnLButtonDown函数,并且把鼠标按下时的点坐标传递给你。你是不是认为系统把点坐标告诉你就是向你“输出参数”?
------解决思路----------------------
楼主的意义,微软应该这样定义这个函数:
void CTextView::OnDraw(const CDC* pDC)
目前大部分的代码都不加const,因此,你可以误解成是可以修改的,其实是不能修改的。这些根本就不是输出参数,如果是输出参数,一般MSDN里面会明确提示你。
把参数加const,可以有效的防止别人修改,但是其实没什么用,因为C/C++太灵活了。const可以强制转换成非const的,所以加不加都没啥意义。
------解决思路----------------------
"后面的void CTextView::OnLButtonDown(UINT nFlags, CPoint point) 中的point参数呢"
void 说明函数 OnLButtonDown 没有返回值。
而 (UINT nFlags, CPoint point)是输入参数,但通常你不能改(改了也没用,因为是‘值’传递)。
只有 指针传递的参数 有可能 既是输入,又是输出(可以改)