我可以做这个:
#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) 我被同事问过这个问题,我们是否应该在类中包含默认构造函数?如果是这样,为什么?如果不是,为什么不呢?
例
public class Foo {
Foo() { }
Foo(int x, int y) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
我也有兴趣从专家那里了解一下.
我最近厌倦了在创建我的时候经常不知道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) 我有一个关于Java中的默认构造函数和继承的问题.
通常,如果你编写一个类并且不包含任何构造函数,Java会自动为你提供一个默认构造函数(一个没有参数),它初始化类的所有实例变量(如果有的话)都有一些默认值(0,null或者是假的.但是,如果使用某些参数编写构造函数,并且不编写任何默认构造函数,则Java不提供默认构造函数.我的问题是:类继承自其他类的情况是什么 - 如果我编写一个带有一些参数的构造函数,但是不包含默认构造函数,它们是否继承了超类的默认构造函数?
当我没有声明constructor例如,编译器将为我提供一个default constructor没有参数和没有定义(正文)的东西,因此,不会采取任何行动.
如果我现在不声明a destructor,编译器将为我提供一个default destructor没有defintion(正文),因此,我认为没有动作.
所以,如果我完成了一个对象,例如,对象使用的default destructor重新分配(免费)内存是不是?如果没有,为什么我们得到它?
并且,也许同样的问题适用于default constructor.如果它什么都没有,为什么它默认为我们创建?
谢谢.
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而不需要默认构造函数,或者在任何情况下它都不起作用?
我正在准备我的CPP考试,其中一个问题是:你能否删除默认的类构造函数,如果是,那么这样做的原因是什么?好的,显然你可以这样做:
class MyClass
{
public:
MyClass() = delete;
};
Run Code Online (Sandbox Code Playgroud)
但我不明白你为什么要这样做?
在Effective C++一书中,我看到了以下段落:
结果,如果你写
Run Code Online (Sandbox Code Playgroud)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;
但是在拆解通过编译上面的代码创建的可执行文件之后,我意识到并非如此:没有任何函数被调用.
这是主要的汇编代码:
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.
那么在我们调用构造函数或赋值空类之后,编译器的行为究竟是什么?这本书说它会产生一些功能吗?如果是这样,他们存放在哪里?
代码示例:
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”的构造函数(第一个代码)和编译器创建的构造函数(如第二个代码)有什么区别?
有人可能想要使用参数声明一个函数,并指定参数的默认值是类型的默认构造函数的结果:
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++ ×6
constructor ×4
java ×2
.net ×1
android ×1
c# ×1
c++11 ×1
clr ×1
destructor ×1
empty-class ×1
gson ×1
inheritance ×1
json ×1
scope ×1