标签: default-constructor

如果没有默认构造函数,为什么不编译?

我可以做这个:

#include <iostream>

int counter;

int main()
{
    struct Boo
    {
        Boo(int num)
        {
            ++counter;
            if (rand() % num < 7) Boo(8);
        }
    };

    Boo(8);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这将编译正常,我的计数器结果是21.但是,当我尝试创建Boo传递构造函数参数而不是整数文字的对象时,我得到一个编译错误:

#include <iostream>

int counter;

int main()
{
    struct Boo
    {
        Boo(int num)
        {
            ++counter;
            if (rand() % num < 7) Boo(num); // No default constructor 
                                            // exists for Boo
        }
    };

    Boo(8);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如何在第二个示例中调用默认构造函数,而不是在第一个示例中调用?这是我在Visual Studio 2017上遇到的错误.

在线C++编译器onlineGDB我得到错误:

error: no matching function for call to ‘main()::Boo::Boo()’ …
Run Code Online (Sandbox Code Playgroud)

c++ constructor scope default-constructor most-vexing-parse

70
推荐指数
2
解决办法
5193
查看次数

我们是否应该始终在类中包含默认构造函数?

我被同事问过这个问题,我们是否应该在类中包含默认构造函数?如果是这样,为什么?如果不是,为什么不呢?

public class Foo {

    Foo() { }

    Foo(int x, int y) {
        ...
    } 

}
Run Code Online (Sandbox Code Playgroud)

我也有兴趣从专家那里了解一下.

.net c# clr default-constructor

67
推荐指数
4
解决办法
5万
查看次数

创建片段:构造函数与newInstance()

我最近厌倦了在创建我的时候经常不知道String要传递参数的键.所以,我决定把我的构造函数,将采取我想设置的参数,并把这些变量到用正确的按键,因此省去了其他的需求和需要知道这些密钥.BundlesFragmentsFragmentsBundlesStringFragmentsActivities

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);
}
Run Code Online (Sandbox Code Playgroud)

然后我像平常一样提出这些论点.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.v(TAG, "onCreate");

    // Set incoming parameters
    Bundle args = getArguments();
    if (args != null) {
        mImageResourceId …
Run Code Online (Sandbox Code Playgroud)

android constructor default-constructor android-fragments

54
推荐指数
1
解决办法
3万
查看次数

Java中的默认构造函数和继承

我有一个关于Java中的默认构造函数和继承的问题.

通常,如果你编写一个类并且不包含任何构造函数,Java会自动为你提供一个默认构造函数(一个没有参数),它初始化类的所有实例变量(如果有的话)都有一些默认值(0,null或者是假的.但是,如果使用某些参数编写构造函数,并且不编写任何默认构造函数,则Java不提供默认构造函数.我的问题是:类继承自其他类的情况是什么 - 如果我编写一个带有一些参数的构造函数,但是不包含默认构造函数,它们是否继承了超类的默认构造函数?

java inheritance initialization default-constructor

51
推荐指数
5
解决办法
9万
查看次数

C++默认析构函数

当我没有声明constructor例如,编译器将为我提供一个default constructor没有参数和没有定义(正文)的东西,因此,不会采取任何行动.

如果我现在不声明a destructor,编译器将为我提供一个default destructor没有defintion(正文),因此,我认为没有动作.

所以,如果我完成了一个对象,例如,对象使用的default destructor重新分配(免费)内存是不是?如果没有,为什么我们得到它?

并且,也许同样的问题适用于default constructor.如果它什么都没有,为什么它默认为我们创建?

谢谢.

c++ constructor destructor default-constructor

51
推荐指数
6
解决办法
6万
查看次数

Gson是否必须使用默认的no-args构造函数?

Gson用户指南声明我们应该为任何类定义默认的no-args构造函数以正确使用Gson.更重要的是,在Gson 类的javadoc中,InstanceCreator如果我们尝试反序列化缺少默认构造函数的类的实例,那么将抛出异常,我们应该InstanceCreator在这种情况下使用.但是,我尝试使用缺少默认构造函数的类来测试使用Gson,并且序列化和反序列化工作都没有任何问题.

这是deserializaiton的一段代码.没有非args构造函数的类:

public class Mushroom {
    private String name;
    private double diameter;

    public Mushroom(String name, double diameter) {
        this.name = name;
        this.diameter = diameter;
    }

    //equals(), hashCode(), etc.
}
Run Code Online (Sandbox Code Playgroud)

和测试:

@Test
public void deserializeMushroom() {
    assertEquals(
            new Mushroom("Fly agaric", 4.0),
            new Gson().fromJson(
                    "{name:\"Fly agaric\", diameter:4.0}", Mushroom.class));
}
Run Code Online (Sandbox Code Playgroud)

哪个工作正常.

所以我的问题是:我是否真的可以使用Gson而不需要默认构造函数,或者在任何情况下它都不起作用?

java json default-constructor gson

51
推荐指数
1
解决办法
2万
查看次数

删除默认类构造函数有什么意义?

我正在准备我的CPP考试,其中一个问题是:你能否删除默认的类构造函数,如果是,那么这样做的原因是什么?好的,显然你可以这样做:

class MyClass 
{ 
  public: 
    MyClass() = delete; 
};
Run Code Online (Sandbox Code Playgroud)

但我不明白你为什么要这样做?

c++ default-constructor

50
推荐指数
4
解决办法
6609
查看次数

C++在空类中编写和调用的函数是什么?

Effective C++一书中,我看到了以下段落:

结果,如果你写

class Empty{};
Run Code Online (Sandbox Code Playgroud)

它基本上和你写的一样:

class Empty {
public:
    Empty() { ... }
    Empty(const Empty& rhs) { ... }
    ~Empty() { ... }
    Empty& operator=(const Empty& rhs) { ... } // copy assignment operator
};
Run Code Online (Sandbox Code Playgroud)

以下代码将导致生成每个函数:

Empty e1;
Empty e2(e1);
e2 = e1;
Run Code Online (Sandbox Code Playgroud)

但是在拆解通过编译上面的代码创建的可执行文件之后,我意识到并非如此:没有任何函数被调用.

这是主要的汇编代码:

00000000004006cd <main>:
  4006cd:       55                      push   %rbp
  4006ce:       48 89 e5                mov    %rsp,%rbp
  4006d1:       b8 00 00 00 00          mov    $0x0,%eax
  4006d6:       5d                      pop    %rbp
  4006d7:       c3                      retq 
Run Code Online (Sandbox Code Playgroud)

段中没有任何名为"Empty"的函数.text.

那么在我们调用构造函数或赋值空类之后,编译器的行为究竟是什么?这本书说它会产生一些功能吗?如果是这样,他们存放在哪里?

c++ default-constructor effective-c++ empty-class

43
推荐指数
3
解决办法
3287
查看次数

构造函数“=default”和C++中编译器生成的构造函数有什么区别?

代码示例:

class Dog
{
private:
    int x;
public:
    Dog()=default;
};
Run Code Online (Sandbox Code Playgroud)

对比 这段代码:

class Dog
{
private:
    int x;
};
Run Code Online (Sandbox Code Playgroud)

“=default”的构造函数(第一个代码)和编译器创建的构造函数(如第二个代码)有什么区别?

c++ constructor default-constructor

41
推荐指数
3
解决办法
3245
查看次数

将默认参数值设置为默认构造函数的更好语法

有人可能想要使用参数声明一个函数,并指定参数的默认值是类型的默认构造函数的结果:

void foo(a::really::long::type::name arg = a::really::long::type::name());
Run Code Online (Sandbox Code Playgroud)

是否有更好的语法,不涉及输入类型名称两次?就像是:

void foo(a::really::long::type::name arg = default);
Run Code Online (Sandbox Code Playgroud)

我意识到我可以typedef使用类型名称使其更漂亮,但我很好奇是否存在这样的语法.

c++ optional-parameters default-constructor c++11

38
推荐指数
1
解决办法
2247
查看次数