在C#、C++和Java中,当你创建一个带参数的构造函数时,默认的无参数构造函数就消失了。我一直都在接受这个事实,但现在我开始想知道为什么。
出现这种行为的原因是什么?这只是一种“安全措施/猜测”的说法吗?“如果你已经创建了自己的构造函数,你可能不想让这个隐式的构造函数出现”?
发布于 2012-08-03 23:48:24
编辑。实际上,虽然我在第一个答案中说的是正确的,但这才是真正的原因:
在开始的时候,C语言不是面向对象的(你可以采用面向对象的方法,但它不能帮助你,也不能强制执行任何东西)。
C++是面向对象的,因此鼓励封装,并确保对象的不变性-在构造和任何方法的开始和结束时,对象都处于有效状态。
但C++的一个目标是与C语言兼容,尽可能多地,所有有效的C程序也是有效的C++程序(目标不再是活动的,而C语言独立于C++的演变意味着它不再有效)。
前者用C语言做事情(默认情况下所有东西都是公开的),后者用好的OO方式做事情(默认情况下所有东西都是私有的,开发人员主动地公开他们想公开的东西)。
另一个原因是,为了让C的struct
在C++中有效,它不能有构造函数,因为C没有构造函数,所以必须用C++的方式来看待它。因此,虽然没有构造函数会与积极确保不变量的OO实践背道而驰,但C++认为这意味着有一个默认的无参数构造函数,它的行为就像是有一个空的主体。
但是,如果您确实在class
或struct
中放置了构造函数,那么您将使用C++/OO方式而不是C方式,并且不需要默认构造函数。
由于它是一种速记,所以即使在兼容性不可能的情况下,人们也会继续使用它(它使用了其他不是C语言的C++特性)。
斯特劳斯特鲁普在他的《C++编程语言》一书中写到了这一点,甚至更多地关注了C++设计和发展中语言的“为什么”。
===原始答案===
让我们假设这并没有发生。
比方说,我不想要无参数构造函数,因为如果没有参数构造函数,我就不能将类置于有意义的状态。实际上,这是在C#中使用struct
时可能发生的事情(但是如果您不能在C#中有效地使用全零和空值的struct
,那么您充其量只能使用一个非公开可见的优化,否则在使用struct
时就会有一个设计缺陷)。
至少,我需要创建一个私有的无参数构造函数,以确保调用代码不会调用默认值。
这使语言变得更加复杂。最好不要这样做。
总而言之,最好不要认为添加构造函数就是删除默认构造函数,最好将根本没有构造函数看作是添加一个不做任何事情的无参数构造函数的语法糖。
发布于 2012-08-03 16:43:20
如果您自己没有做任何事情来控制对象的创建,则会添加默认的无参数构造函数。一旦你创建了一个单独的构造函数来获得控制权,编译器就会“后退”,让你拥有完全的控制权。
如果不是这样的话,如果你只想通过一个带参数的构造函数来构造对象,那么你就需要一些明确的方法来禁用默认的构造函数。
发布于 2012-08-03 16:44:42
我认为问题应该是相反的:如果你没有定义任何其他构造函数,为什么不需要声明一个默认构造函数呢?
构造函数对于非静态类是必需的。
所以我认为,如果您没有定义任何构造函数,那么生成的默认构造函数只是C#编译器的一个方便特性,而且如果没有构造函数,您的类将不会有效。所以,隐式生成一个什么也不做的构造函数并没有错。它看起来当然比到处都是空的构造函数看起来更干净。
如果你已经定义了一个构造函数,那么你的类是有效的,那么为什么编译器要假设你想要一个默认的构造函数呢?如果你不想要呢?实现一个属性来告诉编译器不要生成那个默认的构造函数?我不认为这是个好主意。
https://stackoverflow.com/questions/11792207
复制相似问题