这些 C++ 代码片段有啥作用?
Posted
技术标签:
【中文标题】这些 C++ 代码片段有啥作用?【英文标题】:What do these C++ code snippets do?这些 C++ 代码片段有什么作用? 【发布时间】:2009-08-30 00:43:51 【问题描述】:#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
为什么要定义这些标签?
CSortHeaderCtrl::CSortHeaderCtrl()
: m_iSortColumn( -1 )
, m_bSortAscending( TRUE )
冒号后面的两个函数是干什么用的?
BEGIN_MESSAGE_MAP(CSortHeaderCtrl, CHeaderCtrl)
//AFX_MSG_MAP(CSortHeaderCtrl)
// NOTE - the ClassWizard will add and remove mapping macros here.
//AFX_MSG_MAP
END_MESSAGE_MAP()
C#中有类似的东西吗?
这是干什么用的?
virtual ~CSortHeaderCtrl();
为什么要将析构函数设置为虚函数?
void CSortHeaderCtrl::Serialize( CArchive& ar )
什么时候调用这个函数?
这是从父级扩展而来的吗?
顺便说一句,当你想扩展一个 MFC 类时,你会阅读什么文档?
既然我们不知道它有什么功能,我们可以覆盖什么功能?
以下是头文件:
/* File: SortHeaderCtrl.h
Purpose: Provides the header control, with drawing of
the arrows, for the list control.
*/
#ifndef SORTHEADERCTRL_H
#define SORTHEADERCTRL_H
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CSortHeaderCtrl : public
CHeaderCtrl // Construction public:
CSortHeaderCtrl();
// Attributes public:
// Operations public:
// Overrides // ClassWizard generated
virtual function overrides
//AFX_VIRTUAL(CSortHeaderCtrl)
public: virtual void Serialize(CArchive& ar);
//AFX_VIRTUAL
// Implementation public: virtual
~CSortHeaderCtrl();
void SetSortArrow(
const int iColumn,
const BOOL bAscending );
// Generated message map functions
protected:
void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct );
int m_iSortColumn;
BOOL m_bSortAscending;
//AFX_MSG(CSortHeaderCtrl) //
NOTE - the ClassWizard will add and
remove member functions here.
//AFX_MSG
DECLARE_MESSAGE_MAP() ;
//AFX_INSERT_LOCATION // Microsoft
Visual C++ will insert additional
declarations immediately before the
previous line.
#endif // SORTHEADERCTRL_H
【问题讨论】:
void CSortHeaderCtrl::Serialize(CArchive& ar) 什么时候调用这个函数?这是从父级扩展而来的吗?顺便说一句,当你想扩展一个 MFC 类时,你会阅读什么文档?由于我们不知道它有什么功能,我们可以覆盖什么功能......有人回答最后一个问题吗?谢谢 【参考方案1】:问题 1:DEBUG_NEW 可能是这样,“new”操作符记录了一些额外的信息,关于分配块的位置和时间,以帮助检测内存泄漏,请参阅this。 THIS_FILE[] 静态字符数组简单保存当前文件名,可能由调试“新”使用
问题 2:这是一个 C++ 初始化列表。
问题3:析构函数被声明为virtual,因为还有其他virtual members,这是一个派生类。 'delete' 操作符需要知道它正在删除的对象的正确大小,以及要调用的实际析构函数,请参阅this
【讨论】:
【参考方案2】:至于问题 2:那些不是函数。对于 CSortHeaderCtrl 的成员,它们是 initializer lists。你可以把它想象成 相当于:
m_iSortColumn = -1;
m_bSortAscending = TRUE;
我强调“想想”,因为对于成员来说 类,只会调用复制构造函数(而不是首先调用 复制构造函数,然后是赋值运算符)。
请注意,使用初始化列表时,初始化顺序 不是由写的顺序决定的,而是由顺序决定的 类继承和成员的声明顺序 变量。
【讨论】:
谢谢,其他人怎么样? 对不起,我无法回答所有问题,问题1和问题3已经被其他人回答了。 void CSortHeaderCtrl::Serialize(CArchive& ar) 什么时候调用这个函数?这是从父级扩展而来的吗?顺便说一句,当你想扩展一个 MFC 类时,你会阅读什么文档?由于我们不知道它有什么功能,我们可以覆盖什么功能......【参考方案3】:为什么要定义这些标签?
查看 jcopenha 的回答。
冒号后面的两个函数用于什么?
见彼得的回答。
C#中是否有类似的东西?这是干什么用的?
在 C# 中,它可能被实现为委托字典。
它被称为“消息映射”(可能在MFC Library Reference Message Handling and Mapping 的一个小节中进行了描述)。
其内容通常是通过 IDE“类向导”创建/编辑的(不是使用代码/文本编辑器手动编辑的)。
为什么要把析构函数设为虚函数?
在 C++ 中,如果一个类可能是子类,那么它的析构函数几乎总是虚拟的(因为否则,如果它不是虚拟的并且您通过删除指向超类的指针来调用它,则不会调用子类的析构函数) .
这个函数什么时候调用?
这可能在这里描述:MFC Library Reference Serialization in MFC。
这是从父级扩展而来的吗?
根据我刚才给出的链接,它是 CObject 祖先类:“MFC 在 CObject 类中提供了对序列化的内置支持。因此,从 CObject 派生的所有类都可以利用 CObject 的序列化协议。”
顺便说一句,当你想扩展一个 MFC 类时,你会阅读什么文档?
MFC 参考文档。
由于我们不知道它有什么功能,我们可以覆盖什么功能...
您通常可以覆盖所有虚拟而非私有的内容。我认为您也可以/改为使用 IDE 内置的类向导。
CSortHeaderCtrl 显然是第 3 方类,但不是 Microsoft 类。也许它的作者/供应商为它写了一些文档,如果你应该使用它的话。
【讨论】:
【参考方案4】:首先,CSortHeaderCtrl
有一个虚拟析构函数,因为在 C++ 中将析构函数设为虚拟是正确的做法。
析构函数在基类中是虚拟的,因为这意味着从基类派生的类中的析构函数将被调用。
如果不调用派生类中的析构函数(即基类析构函数是非虚拟的),那么它们很可能会泄漏内存并使资源(流、句柄等)处于打开状态。
您发布的其余代码由 Visual Studio 生成,用于为您处理常见或冗余的 MFC 任务,例如将 Win32 消息映射到类或窗口的成员函数。您不应该触摸此代码,因为它可能会被覆盖,否则您会破坏它并遇到与调试相关的头痛问题。
【讨论】:
【参考方案5】:我的析构函数什么时候应该是虚拟的?
http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.7
【讨论】:
以上是关于这些 C++ 代码片段有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章