Questions tagged «default-constructor»

3
默认构造函数和析构函数的“ = default”与“ {}”有何不同?
我最初将此问题仅发布为关于析构函数的问题,但现在我添加了对默认构造函数的考虑。这是原始问题: 如果我想给我的类一个虚拟的析构函数,但在其他方面与编译器生成的析构函数相同,则可以使用=default: class Widget { public: virtual ~Widget() = default; }; 但是似乎我可以通过使用空定义进行更少的键入而获得相同的效果: class Widget { public: virtual ~Widget() {} }; 这两种定义有什么不同的表现方式吗? 根据针对该问题发布的答复,默认构造函数的情况似乎类似。既然对于析构函数,“ =default”和“ {}”之间的含义几乎没有差异,那么对于默认构造函数,这些选项之间的含义几乎也没有差异吗?也就是说,假设我要创建一个将同时创建和销毁该类型的对象的类型,为什么我要说 Widget() = default; 代替 Widget() {} ? 如果在发布原始问题后再提出此问题违反了某些SO规则,我深表歉意。为默认构造函数发布一个几乎相同的问题令我震惊,因为它是不太理想的选择。

11
为什么在创建带参数的默认无参数构造函数时会消失
在C#,C ++和Java中,当创建带有参数的构造函数时,默认的无参数函数将消失。我一直只是接受这个事实,但是现在我开始怀疑为什么。 这种行为的原因是什么?难道仅仅是“安全措施/猜测”这样的说法:“如果您创建了自己的构造函数,那么您可能不希望这种隐式结构徘徊”?还是出于技术原因,一旦您自己创建了构造函数,编译器就不可能添加一个?

11
使用JPA的Kotlin:默认构造函数地狱
根据JPA的要求,@Entity类应具有默认的(非arg)构造函数,以在从数据库中检索对象时实例化这些对象。 在Kotlin中,可以很方便地在主构造函数中声明属性,如以下示例所示: class Person(val name: String, val age: Int) { /* ... */ } 但是,当将非arg构造函数声明为辅助构造函数时,它要求传递主要构造函数的值,因此需要一些有效值,例如: @Entity class Person(val name: String, val age: Int) { private constructor(): this("", 0) } 在情况下,当性能有一些更复杂的类型不只是String和Int他们是不可为空的,它看起来完全坏为他们提供价值,尤其是当有在主构造和太多的代码init块,当正在积极使用的参数- -当通过反射重新分配它们时,大多数代码将再次执行。 此外,val在构造函数执行后无法重新分配-properties,因此也失去了不变性。 所以问题是:如何在不进行代码重复,选择“魔术”初始值和丧失不变性的情况下使Kotlin代码适用于JPA? PS是真的,除了JPA之外,Hibernate可以使用默认构造函数构造对象吗?


4
默认初始化std :: array?
使用C ++ 11 std::array,我是否可以保证语法std::array<T, N> x;将默认初始化数组的所有元素? 编辑:如果没有,是否有一种语法将对所有数组(包括零大小的数组)起作用,以将所有元素初始化为其默认值? 编辑:在cppreference上,默认的构造函数描述为: (constructor) (implicitly declared) (public member function) default-constructs or copy-constructs every element of the array 所以答案可能是肯定的。但我想根据标准或将来的标准确定这一点。

4
使用反射在C#中创建没有默认构造函数的类型实例
以下面的类为例: class Sometype { int someValue; public Sometype(int someValue) { this.someValue = someValue; } } 然后,我想使用反射创建此类型的实例: Type t = typeof(Sometype); object o = Activator.CreateInstance(t); 通常这将起作用,但是由于SomeType尚未定义无参数构造函数,因此对的调用Activator.CreateInstance将引发类型异常,MissingMethodException并显示消息“未为此对象定义无参数构造函数。 ”是否还有其他方法可以创建此类型的实例?将无参数的构造函数添加到我的所有类中有点麻烦。

3
什么时候私有构造函数不是私有构造函数?
假设我有一个类型,并且想将其默认构造函数设为私有。我写以下内容: class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a private constructor of class 'C' (clang++) // error C2248: 'C::C' cannot access private member declared in class 'C' (MSVC) auto c2 = C(); // …


1
删除操作符delete()时,操作符new()的行为会有所不同,具体取决于默认构造函数的存在
使用运算符new()创建类C的新对象会在此处产生错误: class C { public: C() {} virtual ~C() {} void operator delete(void*) = delete; }; int main() { C* c = new C; } 与 C2280: 'void C::operator delete(void *)': function was explicitly deleted 但是,当我更换C() {} 使用C() = default; 或删除线,使编译器插入一个默认的构造函数(我相信有同样的效果= default),该代码将编译并运行。 使编译器生成的默认构造函数和用户定义的默认构造函数之间发生什么区别? 我在这篇文章中得到了一些提示,但是这里的C类(没有用户提供的构造函数)并不简单,因为析构函数是虚拟的,对吗? 与最新的Visual Studio c ++ 17一起编译。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.