1

我是 MFC 编程的新手。这些天我正在使用 Jeff Prosise 的书来学习 MFC 编程。我遇到过:CClientDC dc (this);并且我从 CClientDC 类的定义中找到了一个构造函数:CClientDC(CWnd* pWnd);但是如果我替换CClientDC dc (this);CClientDC dc = CClientDC(this);. 编译器告诉我这是一个错误。我无法理解。我认为CClientDC dc (this);是一样的东西CClientDC dc = CClientDC(this);。或者换句话说,前者是一种简单的形式。

非常感谢。

4

3 回答 3

7
CClientDC dc = CClientDC(this);

相当于

CClientDC dc(CClientDC(this));

为此,CClientDC必须有一个复制或移动构造函数,因为您基本上dc是通过从临时对象复制来构造的。

如果初始化是 [...] 复制初始化,其中源类型的 cv 非限定版本与 [...] 目标类型相同,则考虑构造函数。[...]调用如此选择的构造函数来初始化对象,初始化表达式或表达式列表作为其参数。如果没有构造函数适用,或者重载决议不明确,则初始化格式错误。

于 2013-04-08T09:41:41.243 回答
1

CObject(CClientDC 和 CDC 的基类)的复制构造函数和重载赋值运算符显式标记为 private afx.h

private:
    CObject(const CObject& objectSrc);              // no implementation
    void operator=(const CObject& objectSrc);       // no implementation

这是显式完成的,因为 DC 对象(和其他基于 CObject 的类)中的许多成员(例如 HDC 成员)需要显式处理才能被多次引用。否则,一个实例的析构函数可能会“关闭”底层句柄。从而使另一个实例处于不确定(坏)状态。

于 2013-04-08T09:55:03.797 回答
0

为了成功执行 CClientDC dc = CClientDC(this),需要有一个 CClientDC 的重载构造函数,它以 cwind* 作为参数并返回 CClientDC 。但它不存在。所以编译器给出错误。

于 2013-04-08T09:57:23.707 回答