是否必须在超类中使用默认构造函数才能继承它?假设每个派生类构造函数都显式调用一个超类构造函数,提供正确的参数 - 这样的代码会起作用吗?
参加以下课程:
class Foo{
public:
Foo(std::string bar_, int baz_ = 7)
:bar(bar_)
,baz(baz_)
{}
private:
std::string bar;
int baz;
};
Run Code Online (Sandbox Code Playgroud)
自Foo(std :: string bar_,int baz_ = 7); 是我唯一的构造函数,编译器不应该为我实现默认构造函数吧?我认为构建这个类的唯一两种方法是:
Foo foo("foo");
//or
Foo foo("foo",0);
//plus copy constructor and overloaded assignment operator.
Run Code Online (Sandbox Code Playgroud)
然而,为什么这可能呢?
int main(){
Foo foo();
}
Run Code Online (Sandbox Code Playgroud)
当唯一的公共构造函数需要第一个参数的值时,我不明白如何默认构造一个类.将默认构造函数设为私有或尝试使用C++ 11删除它,没有任何区别.这是怎么回事?
http://ideone.com/CL7IZo
好的,我是我的主类,从我的框架中加载所有内容.我现在遇到的麻烦是我的碰撞检测; 我已经得到了它,如果它碰到某些东西,会发生一些事情.我有一个在GameScreen类中调用GameOverUI的方法,但我想在我的Enemy.class中使用它.我已经为该对象创建了一个新实例,但是它说它未定义.我没有得到的是该类没有定义,但是(游戏游戏)定义了一个名为GameScreen的方法.
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import android.graphics.Color;
import android.graphics.Paint;
import com.vaughanslater.framework.Game;
import com.vaughanslater.framework.Graphics;
import com.vaughanslater.framework.Image;
import com.vaughanslater.framework.Input.TouchEvent;
import com.vaughanslater.framework.Screen;
public class GameScreen extends Screen {
enum GameState {
Ready, Running, Paused, GameOver
}
GameState state = GameState.Ready;
// Variable Setup
private static Background bg1, bg2;
private static Robot robot;
public static Heliboy hb, hb2;
private Image currentSprite, character, character2, character3, heliboy,
heliboy2, heliboy3, heliboy4, heliboy5;
private Animation anim, hanim;
private ArrayList tilearray = new ArrayList();
int livesLeft …Run Code Online (Sandbox Code Playgroud) 我无法绕着这个缠绕我的头.我有2个构造函数.第一个有2个参数:
public Instrument(string name, string category)
{
this.Name = name;
this.Category = category;
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个默认(无参数)构造函数,其默认值为常量:
public Instrument()
{
this.Name = DefaultName;
this.Category = DefaultCategory;
}
Run Code Online (Sandbox Code Playgroud)
我也应该从无参数构造函数调用2参数构造函数.我该怎么做呢?我也质疑为什么这甚至是必要的.如果从默认值调用2参数,您将如何将默认值传递给应用程序?所以我想我的主要问题是如何从默认构造函数中调用2参数构造函数?
我在这里看到了一些代码.
有一个类具有私有默认构造函数,其中包含空主体和参数化构造函数.代码评论说,默认的构造函数作出私有"这样它会不会有可能创建一个没有指定属性的对象" [属性是由类的数据成员代表.因此,没有明确定义私有默认构造函数的用法,因为它无法使用!
一旦我们声明了参数化构造函数,编译器就不会隐式提供默认构造函数!因此,没有办法创建没有参数传递给不存在的构造函数的对象.
我的问题是为什么我们需要在这种情况下,申报了默认的构造函数在所有?
如何在c ++中初始化参数化构造函数作为默认构造函数?我的考试中提到了这个问题.我们得到了一个参数化的构造函数,它也作为默认构造函数.
c++ constructor default-constructor parameterized-constructor
我今天在网上看到了一个C++ 03示例.
class Cat {
public:
Cat(const Cat& iCat);
};
Run Code Online (Sandbox Code Playgroud)
有人告诉我,在这种情况下,编译器不会自动生成默认构造函数.如果为true,则表示可以从现有Cat对象创建新的Cat对象.
在这种情况下,有人能告诉我如何创建第一个Cat对象吗?如果我的理解是错误的,请善意地纠正我.
我已经离开C++一段时间了,我试图确定定义类的私有成员变量(如果有的话)的这两个默认构造函数初始化之间的区别.类定义位于头文件中,而实现位于单独的文件中.所有私有成员变量都需要初始化为"0"或无意义的值.
注意:
int data [MAX_SIZE]是一个固定大小的编译时数组.int used:是数组的索引跟踪器.
一般来说,我习惯于通过以下方式初始化成员:
// Default Constructor
IntSet::IntSet()
{
data[MAX_SIZE-1] = {0}
used = 0;
}
Run Code Online (Sandbox Code Playgroud)
我正在梳理一些遗留代码并找到完全不同的语法:
// Default Constructor
IntSet::IntSet() : used(0)
{
data[MAX_SIZE-1] = {0};
}
Run Code Online (Sandbox Code Playgroud)
最终结果有区别吗?
为每个非用户定义的构造函数声明始终默认的构造函数有什么利弊?
考虑一个具有用户定义的构造函数的类,该构造函数不需要其他用户定义的构造函数,它将是:
class Foo
{
public:
Foo() { // user-defined declaration }
Foo(const Foo&) = default;
Foo(Foo&&) noexcept = default;
~Foo() = default;
Foo& operator=(const Foo&) = default;
Foo& operator=(Foo&&) = default;
}
Run Code Online (Sandbox Code Playgroud)
这样做有其他实际的优点/缺点吗?
我不知道为什么标准允许这种声明。
class A
{
public:
A() : bar(0){}
A(int foo) : bar(foo){}
private:
int bar;
};
class B : public A
{
public:
B() = delete;
};
Run Code Online (Sandbox Code Playgroud)
B无法实例化。
B b1; //error: use of deleted function ‘B::B()’
B b2(2); //error: no matching function for call to ‘B::B(int)’
Run Code Online (Sandbox Code Playgroud)
仍然适用
class A
{
public:
A() : bar(0){}
private:
int bar;
};
class B : public A
{
public:
B() = delete;
};
Run Code Online (Sandbox Code Playgroud)
这使
B b1; //error: use of deleted function ‘B::B()’
Run Code Online (Sandbox Code Playgroud)
注意:这与没有默认的ctor不同:
class …Run Code Online (Sandbox Code Playgroud)