为啥并不总是有默认构造函数[重复]

Posted

技术标签:

【中文标题】为啥并不总是有默认构造函数[重复]【英文标题】:why is there not always a default constructor [duplicate]为什么并不总是有默认构造函数[重复] 【发布时间】:2013-04-22 00:34:43 【问题描述】:

在 C# 中,当我创建一个空类时,它提供了一个默认构造函数,但是当我提供一个带参数的构造函数时,不再创建默认构造函数。

我的问题是:

    为什么编译器不再给我默认构造函数了? 是否有设置始终生成此默认构造函数?

这些问题源于使用 WCF,我需要默认构造函数,但也希望能够为构造函数提供值,并且不必每次都放置默认构造函数会很好,我不认为未使用的默认构造函数会产生很多开销。

【问题讨论】:

一个澄清:它的 WCF 的默认 IInstanceProvider 需要一个默认的服务构造函数......它不是框架本身的限制。您可以使用自定义 IInstanceProvider 来解决此限制。 【参考方案1】:

拥有自定义构造函数(通常)意味着对象的内部状态使用您通过构造函数参数提供的一些自定义信息进行初始化。如果在这种情况下仍然有默认构造函数,那么初始状态会是什么?

如果您没有自定义构造函数,那么假设您只使用默认构造函数就可以了,因为没有要初始化的内部状态。

【讨论】:

【参考方案2】:

没有设置。

在某些情况下,默认构造函数是一种强制约定指定数据的方式。

【讨论】:

【参考方案3】:

默认构造函数存在于...默认。但是,如果您创建自己的参数化构造函数,那么编译器会假定您要使用该构造函数,并且不再发出默认构造函数。

如果您想使用 WCF 的默认值,则必须指定它。如果您愿意,可以在其中使用一些默认值调用参数化构造函数。

【讨论】:

【参考方案4】:

在 C++、C♯、Java 及其后代语言中,编写自定义构造函数是因为需要确保对象已初始化并处于一致状态。编译器无法猜测它应该如何初始化对象,因此它甚至不会尝试。有很多方法可以同时为类设置默认构造函数和自定义构造函数。

Java 有相互引用的构造函数:

public Name(String givenName, String middleName, String surName) ...
public Name(String givenName, String surName) 
    this(givenName, null, surname);

C++11 引入了委托构造函数,它们做同样的事情。 C++ 一直都有默认参数,它也可以做同样的事情。 C♯ 似乎只有默认参数。

其他语言使用约定:Objective-C 让程序员根据指定的初始化程序编写所有初始化程序。

简而言之,总有办法做到这一点,但您必须手动编程。不存在自动方案。

【讨论】:

【参考方案5】:

如果您没有为您的类提供任何构造函数定义,编译器只会创建默认构造函数。原因可能是:当你需要创建对象的实例时,你需要调用构造函数,所以如果编码器没有定义构造函数,编译器会添加它使其工作。

但是一旦你已经定义了一个构造函数,那就是告诉编译器用户意识到了构造函数的需要,因此不会自动添加默认构造函数。您需要手动插入自己的默认构造函数。我不认为有这个设置。

【讨论】:

以上是关于为啥并不总是有默认构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Map::operator[] 总是需要一个默认的构造函数[重复]

为啥在按值返回时总是调用复制构造函数

为啥我不能在 C# 中使用基本构造函数 [重复]

golang函数中的参数为啥不支持默认值

默认构造函数,为啥我的类似乎有三个?当编译器将类视为结构时?

如果类具有参数化构造函数,为啥Java不提供默认构造函数? [复制]