【问题标题】:Should the deleted default constructor be in Public or Private?删除的默认构造函数应该是公共的还是私有的?
【发布时间】:2019-07-29 10:50:44
【问题描述】:

我不得不删除默认构造函数以确保始终使用参数化构造函数。 那时我想知道我删除的默认构造函数是否应该在公共或私有访问说明符下。

我刚刚编写了一个示例代码来测试它。我试图访问已删除的默认构造函数。

class A
{
public:
    A(const int val)
    {
        assign = val;
    }
private:
    A() = delete;
    int assign;
};

int main()
{
    A obj1(5);
    A obj2;
}

main.cpp:在函数'int main()'中:

main.cpp:35:7: 错误:'A::A()' 在此上下文中是私有的

一个 obj2;

main.cpp:28:5: 注意:这里声明为私有

A() = 删除;

main.cpp:35:7: 错误:使用已删除的函数‘A::A()’

一个 obj2;

main.cpp:28:5: 注意:在这里声明

A() = 删除;

【问题讨论】:

  • "我不得不删除默认构造函数以确保始终使用参数化构造函数。"否。如果您有其他构造函数,则不会声明默认构造函数。

标签: c++ c++11 coding-style


【解决方案1】:
  • 您不需要使用已删除的 ctor。
class A
{
public:
    A(const int &val) : assign(val){}
private:
    int assign;
};
int main()
{
    A a;
    return 0;
}

给error: no matching function for call to ‘A::A()’

和

class A
{
public:
    A() = delete;
    A(const int &val) : assign(val){}
private:
    int assign;
};
int main()
{
    A a;
    return 0;
}

给error: use of deleted function ‘A::A()’

  • 关于删除的使用,它可能对继承有用。
class A
{
public:
    A() : assign(0){}
    A(int val) : assign(val){}
private:
    int assign;
};

class B : public A
{
public:
    B() = delete;
    B(int val) : A(val){};
};

class C : public A
{

};

class D : public A
{
public:
    D() = delete;
};


int main()
{
    A a1; //works
    A a2(5); //works

    //B b1; -- does not work : error: use of deleted function ‘B::B()’
    B b2(3); //works

    C c1; //works, creates a default ctor
    //C c2(7); -- does not work : no matching function for call to ‘C::C(int)’

    //D d1; -- does not work :error: use of deleted function ‘D::D()’
    //D d2(2); -- does not work: error: no matching function for call to ‘D::D(int)’
    return 0;
}

注意 D 不能被实例化。虽然很没用:)

【讨论】:

【解决方案2】:

最好用public 访问定义默认构造函数:

class A
{
public:
    A() = delete;
    A(const int &val) : assign(val){}
private:
    int assign;
};

现在你会得到一个更好的错误:

int main (void){
    A obj;
}

【讨论】:

    猜你喜欢
    • 2012-03-14
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多