C++ 为什么是“CClientDC dc(这个);”不能替换为'CClientDC=CClientDC(this)`

C++ 为什么是“CClientDC dc(这个);”不能替换为'CClientDC=CClientDC(this)`,c++,visual-c++,mfc,C++,Visual C++,Mfc,我是MFC编程的新手。这些天我在用Jeff Prosise的书学习MFC编程。我遇到过:CClientDC dc本;我从CClientDC类的定义中找到了一个构造函数:cclientdcwnd*pWnd;但如果我替换了CClientDC dc,则会发生这种情况;使用CClientDC=CClientDCthis;。编译器告诉我这是个错误。我不明白。我认为中国客户贸易发展公司是这样的;与CClientDC=CClientDCthis;相同;。或者换句话说,前者是一种简单的形式 非常感谢 CClie

我是MFC编程的新手。这些天我在用Jeff Prosise的书学习MFC编程。我遇到过:CClientDC dc本;我从CClientDC类的定义中找到了一个构造函数:cclientdcwnd*pWnd;但如果我替换了CClientDC dc,则会发生这种情况;使用CClientDC=CClientDCthis;。编译器告诉我这是个错误。我不明白。我认为中国客户贸易发展公司是这样的;与CClientDC=CClientDCthis;相同;。或者换句话说,前者是一种简单的形式

非常感谢

CClientDC dc = CClientDC(this);
相当于

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

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

相当于

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

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


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

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

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

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

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

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

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

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

这并不能真正回答问题,OP并没有试图复制CClientDC对象。sftrabbit的回答解释了为什么代码并不代表OP所认为的功能。这并不能真正回答问题,OP并没有试图复制CClientDC对象。sftrabbit的回答解释了为什么代码并不代表OP认为它的功能。该构造函数确实存在,并且在问题中明确提到。该构造函数确实存在,并且在问题中明确提到。