为什么我们确实需要构造函数
Why we do need constructors?
今天我的朋友问我,为什么我们真的需要C++中的构造函数?在结构语言中我们可以做同样的事情。构造函数的专长是什么,向我展示构造函数的需求,以便我在C++程序中使用它。请帮我举几个例子,这样我就可以消除他的疑虑。
您不需要构造函数,就像您不需要流行语言的大多数功能一样。
构造函数的存在是为了让做错误的事情变得更加困难。在这种情况下,使用尚未初始化的数据。
一个病态的答案是构造函数不会改变语言的图灵完备性,所以,从严格意义上说,你不需要它们,因为你不需要语言的许多特性。但这是正式的,而不是实际的。你可以原谅晚上只想着理论而感觉不到温暖。
关于构造函数为什么有用,一个很好的实际例子是考虑RAII模式。通过有一个构造函数,可以很好地将初始化和获取封装在销毁的同一个地方。C、 它没有构造函数,因为程序员忘记了这个过程中的一个步骤而闻名。
正如其他人已经回答的那样,您使用构造函数的方式与在过程语言中使用init函数的方式相同,但多亏了构造函数,程序员不会忘记调用init函数-编译器会为他做这件事。除了自动调用它之外,这还带来了一个额外的好处,那就是优雅地解决了继承初始化问题:如果类a扩展了类B,扩展了类C,您可以保证所有三个构造函数(用于类A、B和C)都将被调用,并且它们将以正确的顺序(类C、类B、类A)被调用,这样每个构造函数都可以使用超类中的所有数据(因为它已经初始化)。在没有构造函数的语言的情况下,程序员需要处理所有这些记账。
这只是面向对象语言的工作方式。在C中,您可以使用malloc来分配内存,然后以某种方式初始化该内存。在C++中,构造函数同时做这两件事。通过将这两件事放在一起,这使得开发人员更难分配内存并失败/忘记初始化它
因为有些对象需要数据来初始化。使用构造函数,您可以确保对象在编译时获得数据。否则编译器将抛出错误。
当您使用并行或并发编程时,共享无法更改的对象会容易得多。您不必担心竞争条件、锁等。但是在大多数OOP语言中,创建不可变对象的唯一方法是通过构造函数。无法设置对象的属性,因为根据定义,所有属性都是只读的。
在过程语言中,您也需要将变量初始化为定义良好的值。通常具有某种Init
函数。构造函数是确保在创建对象时将其初始化为有效状态的一种方法。
在.net中,您可以绕过构造函数(使用特权代码),您将得到一个字段初始化为0的对象。
- 为什么我们在C++中使用手动复制构造函数?
- 我们可以用参数化构造函数初始化结构的数组吗?
- 如果普通默认构造函数不执行任何操作,为什么我们不能使用 malloc 创建平凡可构造的对象?
- 为什么我们需要创建一个单参数构造函数来使用临时的无名称对象
- 如果构造函数和析构函数可以获取和显示(打印)数据,为什么我们需要 getter 和 setter?
- 为什么我们需要在构造函数的初始化列表中使用 std::move?
- 我们可以直接为任何数据成员赋值. 为什么要使用构造函数?
- 我们如何使用下面的集合构造函数构造设置元素
- 如果我们有 (N)RVO,当实际调用移动构造函数时?
- 类介绍 (c++) 项目希望我们创建两个构造函数,但它们都不需要任何参数 - 我应该在这里做什么?
- 我们可以在构造函数中定义静态类成员吗?
- 我们可以在不使用构造函数的情况下推回包含矢量的结构
- 为什么我们应该为initializer_list的情况过多载荷转发构造函数
- 为什么我们需要在move构造函数中将右值引用设置为null
- 为什么我们可以在 C++ 的构造函数中使用声明的变量
- 当我们有用于设置值的 setter 时,为什么我们使用参数化构造函数
- 我们可以说构造函数创建对象
- 我们是否应该从派生类调用基类移动复制/分配构造函数
- 如果我们在c++中重载构造函数,那么默认构造函数是否仍然存在
- 为什么我们需要一个用户提供的const对象构造函数