为什么我们确实需要构造函数

Why we do need constructors?

本文关键字:构造函数 我们 为什么      更新时间:2023-10-16

今天我的朋友问我,为什么我们真的需要C++中的构造函数?在结构语言中我们可以做同样的事情。构造函数的专长是什么,向我展示构造函数的需求,以便我在C++程序中使用它。请帮我举几个例子,这样我就可以消除他的疑虑。

您不需要构造函数,就像您不需要流行语言的大多数功能一样。

构造函数的存在是为了让做错误的事情变得更加困难。在这种情况下,使用尚未初始化的数据。

一个病态的答案是构造函数不会改变语言的图灵完备性,所以,从严格意义上说,你不需要它们,因为你不需要语言的许多特性。但这是正式的,而不是实际的。你可以原谅晚上只想着理论而感觉不到温暖。

关于构造函数为什么有用,一个很好的实际例子是考虑RAII模式。通过有一个构造函数,可以很好地将初始化和获取封装在销毁的同一个地方。C、 它没有构造函数,因为程序员忘记了这个过程中的一个步骤而闻名。

正如其他人已经回答的那样,您使用构造函数的方式与在过程语言中使用init函数的方式相同,但多亏了构造函数,程序员不会忘记调用init函数-编译器会为他做这件事。除了自动调用它之外,这还带来了一个额外的好处,那就是优雅地解决了继承初始化问题:如果类a扩展了类B,扩展了类C,您可以保证所有三个构造函数(用于类A、B和C)都将被调用,并且它们将以正确的顺序(类C、类B、类A)被调用,这样每个构造函数都可以使用超类中的所有数据(因为它已经初始化)。在没有构造函数的语言的情况下,程序员需要处理所有这些记账。

这只是面向对象语言的工作方式。在C中,您可以使用malloc来分配内存,然后以某种方式初始化该内存。在C++中,构造函数同时做这两件事。通过将这两件事放在一起,这使得开发人员更难分配内存并失败/忘记初始化它

因为有些对象需要数据来初始化。使用构造函数,您可以确保对象在编译时获得数据。否则编译器将抛出错误。

不可变对象。

当您使用并行或并发编程时,共享无法更改的对象会容易得多。您不必担心竞争条件、锁等。但是在大多数OOP语言中,创建不可变对象的唯一方法是通过构造函数。无法设置对象的属性,因为根据定义,所有属性都是只读的。

在过程语言中,您也需要将变量初始化为定义良好的值。通常具有某种Init函数。构造函数是确保在创建对象时将其初始化为有效状态的一种方法。

在.net中,您可以绕过构造函数(使用特权代码),您将得到一个字段初始化为0的对象。

相关文章: