为什么`CClientDC dc(this);`不能替换为`CClientDC dc = CClientDC(this);`

时间:2013-04-08 09:38:31

标签: c++ visual-c++ mfc

我是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);是一回事。或者换句话说,前者是一种简单的形式。

非常感谢。

3 个答案:

答案 0 :(得分:7)

CClientDC dc = CClientDC(this);

相当于

CClientDC dc(CClientDC(this));

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

  

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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