C++无法实现默认构造函数

Oph*_*lia 0 c++ constructor

我有以下课程:

class Fraction {
    private:
        int x;
        int y;
    public:
    // Constructors
        Fraction(long x = 0, long y = 1);
        Fraction(const Fraction&)=default;//here is the problem
        virtual ~Fraction();
 };
Run Code Online (Sandbox Code Playgroud)

我正在尝试禁用默认的C++构造函数来实现我自己的(我打算用它来复制).所以,我宣布它是默认的.但是,当我试图实现它时:

Fraction::Fraction(const Fraction&){}
Run Code Online (Sandbox Code Playgroud)

编译器向我抛出以下错误:

./src/Fraction.cpp:16:1:错误:显式默认定义'Fraction :: Fraction(const Fraction&)'Fraction :: Fraction(const Fraction&){^包含在../src/Fraction文件中. cpp:8:0:../ src/Images.h:22:2:错误:'Fraction :: Fraction(const Fraction&)'在此明确默认为Fraction(const Fraction&)=默认值;

有没有办法解决它?我做错了什么?我发现了一些关于默认值的文章,但没有任何可以帮我修复这些错误的文章.

Zet*_*eta 7

= default告诉编译器使用默认实现.这也意味着您无法提供自己的.如果您希望编译器创建一个,只需删除= default:

class Fraction {
// ...
    Fraction(const Fraction&); // NO =default
};
Run Code Online (Sandbox Code Playgroud)

顺便说一句,"默认构造函数"是在您不提供任何参数时调用的构造函数,例如

Fraction my_frac; // default constructor called
Run Code Online (Sandbox Code Playgroud)

如果要禁用默认构造函数,请使用=delete:

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

请记住,您当前Fraction(long, long)提供的是默认参数,因此它可以作为默认构造函数.

  • @Ophelia:这取决于具体情况.例如,如果您提供自己的构造函数,它将不再生成默认构造函数.如果你还想要一个,你可以简单地使用`= default`.[这个答案](http://stackoverflow.com/a/20829116/1139697)提供了一些见解. (2认同)