win32应用程序不是那么面向对象,为什么有这么多指针?

对于你们中的一些人来说这可能是一个愚蠢的问题,也许我对这个问题提出了错误,因为我是c ++的新手。 但是我注意到在使用很多win32应用程序时,你会使用大量的指针资源。 为什么必须总是获取对象指针? 为什么不发起一个新的类实例。 说到这一点,我注意到在大多数情况下你永远不会发起新对象,但总是调用返回该指针的方法。 如果该指针正在其他地方使用该怎么办? 如果你改变那个指针并且它正在其他地方被使用,你不能弄乱一些东西。

Windows API是为C语言设计的,它曾经是并且仍然是系统编程最常用的语言; C API是系统API的事实标准,因此几乎所有其他语言都有一些方法可以调用外部C函数,因此编写C API有助于与其他语言兼容。

C API只需要一个简单的ABI,它几乎只包含用于函数的调用约定的定义(以及有关结构布局的内容)。 相反,C ++和其他面向对象的语言需要复杂的ABI,它必须定义对象在内存中的布局,如何处理inheritance,如何布局vtable,如何传播exception,在何处放置RTTI数据, …此外,并非所有语言都是面向对象的,并且使用C ++与其他非面向对象语言一起考虑的API可能是一个真正的痛苦(如果你曾经使用过C语言的COM,你就知道我的意思了)。

顺便说一下,当Windows最初设计时,C ++并没有在PC上如此普及,而且C也没有被广泛使用:实际上,Windows 3.11和很多应用程序的很大一部分仍然是用汇编编写的,因为内存和CPU这个时代的制约因素非常紧张; 编译器也不如现在聪明,特别是C ++。 在手工锻造组装通常是唯一解决方案的机器上,C ++开销实际上是不可接受的。

对于指针来说:Windows API几乎总是使用句柄 ,即不透明指针,能够在不影响现有应用程序的情况下改变每个资源的基本特性,并阻止应用程序使用内部结构。 窗口管理器用于在内部表示窗口的结构是否发生变化并不重要:所有应用程序仅使用HWND,它总是具有指针的大小。 你可能会认为这是某种PIMPL习语。

但是,Windows在某种程度上是面向对象的(参见例如整个“窗口类”概念,或者在更深层次上,NT内核的内部工作,这很大程度上基于“对象”概念),但是它最基本的API,简单的C函数,不知何故隐藏了这个OO本质。 另一方面,shell在很多年后被设计,主要用C ++编写,它提供了一个真正面向对象的COM接口。

有趣的是,您可以在COM中看到在构建跨语言时必须面对的所有权衡,但仍然是C ++偏向于面向对象的接口:结果非常复杂,在某些方面很难看,并且从任何语言使用都不是很简单。 相反,Windows API是简单的函数,通常更容易调用。

如果您对基于C ++ API的系统感兴趣,可以查看Haiku ; 就个人而言,这是其中一个方面因为我对该项目非常感兴趣。

顺便说一句,如果你打算使用API​​进行Win32编程,你最好能得到一本好书来习惯这些“特殊性”和其他Win32习语。 两个着名的是Rector-Newcomer和Petzhold 。

因为Win32 Api是用纯C编写的,而不是C ++。 因此,几乎任何语言的任何程序都可以调用这些API。

此外,没有简单的机制可以在不同的模块和不同的语言中使用对象。 即你不能将C ++类导出到python。 当然,有像OLE / COM这样的技术,但它们仍然写在简单的C上。它们有点复杂使用。

另一方面 – 对普通C函数的调用是标准化的。 因此,您可以使用任何语言从DLL或静态库中调用例程。

Win32旨在使用C语言而不是C ++。
这就是为什么你会看到定义的BOOL返回类型而不是bool
bool特定于C ++,在C中不存在。

对于Microsoft的面向对象的Win32包装器,请参阅MFC 。

从那时起,Microsoft的一个新框架是.Net Framework。
.Net框架虽然基于托管代码,但不是本机运行的。 在Windows上进行GUI编程的最现代方式是WPF甚至Silverlight。

进行非托管GUI编程的最现代方法仍然是使用MFC,尽管有些人仍然喜欢使用直接的Win32。

注意使用指针并不是特定于C,它在C ++中仍然很常见。

第一个原因是因为传递指针很便宜。 指针在x86上是4个字节,在x64上是8个字节。 虽然它指向的结构或类可以在内存中占用更多。 因此实例化一个类意味着一次又一次地保留新的内存。 从速度和内存消耗POV来看,这是无效的。

另一种方法是传递对象或智能指针或类似结构的引用。 但是win32 api是在C时代设计的,所以这就是现在的地方;)

至于可能弄乱指针 – 当然可能。 但是大部分时间他们的生命周期都在API中明确说明(如果不是很明显)。

可能因为Win32 API比主流的面向对象编程“更老”,它的核心并不是C ++ API。

它几乎就像你应该尝试许多OO包装中的一个。 像MFC或.net。

Windows API是普通的旧C,因此无处不在使用指针。 此外,您向Windows询问新指针的原因是因为Windows需要跟踪所有对象…它会分配内容并告诉您指针(有时只是一个数字ID)以便您使用它们。

  • 将C函数作为API允许C和C ++程序员使用它。
  • Windows API又回归了–C在那些日子里很有名。

所有的HWND,HANDLE,HDC都只是一种弱的尝试来制作类似于对象的数据类型(使用struct )。 C FAQ对此有疑问 – > http://c-faq.com/struct/oop.html

要了解指针,您可能需要阅读有关指针的CPlusPlus.com教程 。