在Effective C ++一书中,我看到了下面这段话: 因此,如果你写 class Empty{}; 它基本上就像你写这个一样: class Empty { public: Empty() { … } Empty(const Empty& rhs) { … } ~Empty() { … } Empty& operator=(const Empty& rhs) { … } // copy assignment operator }; 下面的代码将导致每个函数的生成: Empty e1; Empty e2(e1); e2 = e1; 但是在拆解通过编译上面的代码而创build的可执行文件之后,我意识到情况并非如此:没有任何函数被调用。 这里是主要的汇编代码: 00000000004006cd <main>: 4006cd: 55 push %rbp 4006ce: 48 […]
按照JPA的要求,@ @Entity类应该有一个默认的(非arg)构造函数来从数据库中检索对象时实例化对象。 在Kotlin中,属性在主构造函数中声明非常方便,如下例所示: class Person(val name: String, val age: Int) { /* … */ } 但是,当非参数构造函数被声明为次要构造函数时,它需要传递主构造函数的值,所以需要一些有效的值,如下所示: @Entity class Person(val name: String, val age: Int) { private constructor(): this("", 0) } 如果这些属性比String和Int有更复杂的types,并且它们是不可空的,那么为它们提供值看起来完全不好,尤其是当主构造函数和init块中有很多代码,并且参数是积极使用 – 当它们被重新分配时,大部分代码将被重新执行。 而且, val -properties不能在构造函数执行后重新分配,所以不可变性也会丢失。 所以问题是:Kotlin代码如何适应与JPA无代码重复,select“魔术”的初始值和不可变性的损失? PS除了JPA,Hibernate是否可以构造没有默认构造函数的对象呢?
用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 所以答案可能是肯定的。 但是我想根据标准或未来标准来确定。
我最近厌倦了不断地需要知道String键来创build我的Fragments时将参数传入Bundles 。 所以我决定为我的Fragments创build构造函数,这些构造函数将采用我想要设置的参数,并使用正确的String键将这些variables放入Bundles ,因此不需要其他Fragments和Activities需要知道这些键。 public ImageRotatorFragment() { super(); Log.v(TAG, "ImageRotatorFragment()"); } public ImageRotatorFragment(int imageResourceId) { Log.v(TAG, "ImageRotatorFragment(int imageResourceId)"); // Get arguments passed in, if any Bundle args = getArguments(); if (args == null) { args = new Bundle(); } // Add parameters to the argument bundle args.putInt(KEY_ARG_IMAGE_RES_ID, imageResourceId); setArguments(args); } 然后我像正常一样提出这些论点。 @Override public void onCreate(Bundle […]
比方说,我有一个types,我想使其默认构造函数私有。 我写了以下内容: 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(); // error: as above } […]
我最初发布这个只是关于析构函数的问题,但现在我添加了默认构造函数的考虑。 这是原来的问题: 如果我想让我的类是一个虚拟的析构函数,但是与编译器生成的相同,我可以使用=default : class Widget { public: virtual ~Widget() = default; }; 但是,似乎我可以通过使用空白定义来减lessinput来获得相同的效果: class Widget { public: virtual ~Widget() {} }; 这两个定义的行为有什么不同? 基于针对这个问题发布的回复,默认构造函数的情况看起来类似。 鉴于析构函数在“ =default ”和“ {} ”之间的含义几乎没有区别,这些选项对于默认构造函数在意义上几乎没有区别? 也就是说,假设我想创build一个types的对象将被创build和销毁,我为什么要说 Widget() = default; 代替 Widget() {} ? 我很抱歉,如果扩大这个问题后,其原来的发布是违反了一些SO规则。 为默认的构造函数发布几乎相同的问题让我觉得不那么理想。
在C#,C ++和Java中,当您创build一个带参数的构造函数时,默认的无参数构造函数就会消失。 我一直只是接受这个事实,但现在我开始想知道为什么。 这种行为的原因是什么? 这只是一个“安全措施/猜测”,说:“如果你已经创build了自己的构造函数,你可能不希望这个隐含的构造函数挂在”? 还是它有一个技术的原因,使编译器不可能添加一个你自己创build一个构造函数?
我有一个关于Java中的默认构造函数和inheritance的问题。 一般来说,如果你编写一个类而不包含任何构造函数,Java会自动为你提供一个默认的构造函数(一个没有参数),它初始化了类的所有实例variables(如果有的话)和一些默认值(0,null ,或者错误)。 但是,如果你编写了一个构造函数,并且有一些参数,并且你不写任何默认的构造函数,那么Java就不会提供默认的构造函数。 我的问题是:什么是类的情况下,从其他类inheritance – 如果我写一个构造函数的一些参数,但不包括默认的构造函数,他们是否inheritance了超类的默认构造函数?
以下面的课程为例: class Sometype { int someValue; public Sometype(int someValue) { this.someValue = someValue; } } 然后我想使用reflection来创build这种types的实例: Type t = typeof(Sometype); object o = Activator.CreateInstance(t); 通常这是可行的,但是因为SomeType没有定义一个无参数的构造函数,所以对Activator.CreateInstance的调用会抛出一个types为MissingMethodException的exception,消息是“ 没有为这个对象定义无参数的构造函数 ” 。是否还有另一种方法来创build这种types的实例? 将无参数的构造函数添加到我的所有类中会有点儿麻烦。
Gson用户指南指出,我们应该定义任何类的默认无参数构造函数来正确使用Gson。 更甚者,在Gson的InstanceCreator类的javadoc上说,如果我们尝试反序列化类的实例,缺less默认的构造函数,我们应该在这种情况下使用InstanceCreator 。 不过,我试着用缺乏默认构造函数的类来testingGson,而序列化和反序列化都没有任何问题。 这是deserializaiton的一段代码。 没有非参数构造函数的类: public class Mushroom { private String name; private double diameter; public Mushroom(String name, double diameter) { this.name = name; this.diameter = diameter; } //equals(), hashCode(), etc. } 和一个testing: @Test public void deserializeMushroom() { assertEquals( new Mushroom("Fly agaric", 4.0), new Gson().fromJson( "{name:\"Fly agaric\", diameter:4.0}", Mushroom.class)); } 这工作正常。 所以我的问题是: 我真的可以使用Gson而不需要有默认的构造函数,或者在任何情况下它不起作用?