这些 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++ 代码片段有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

这个代码片段有啥作用?

这两个代码片段有啥区别?

C++ 代码片段执行

以下代码片段 C++ 的说明

此 Canon SDK C++ 代码片段的等效 C# 代码是啥?

C++ 代码片段(积累)