将构造函数声明为私有显示错误.至少有一个公共构造函数是强制性的吗?

Kir*_*C K 3 c++ constructor destructor dynamic-memory-allocation c++11

我是C++的学习者.我编写了以下程序.我正在研究构造函数和析构函数的概念.我在下面有这个代码,我声明了一个私有析构函数,并使用main()中类的成员函数访问私有成员.我知道私有构造函数可以声明但是公共构造函数也是强制性的吗?这是我的代码如下:

class Book
{
private:
    int *pages;
    int *price;


    Book()        //default constructor
    {
        pages = new int;
        price = new int;
        *pages = 300;
        *price = 8;
    }

public:
    void pre_destructor()
    {
        std::cout << "The pages:" << *pages << "\n";
        std::cout << "The price:" << *price << "\n";
    }

~Book() //destructor
    {
        std::cout << "The pages:" << *pages << "\n";
        std::cout << "The price:" << *price << "\n";
        delete pages;
        delete price;
    }

};

int main()
{
    using namespace std;
    Book book1;

    cout << "Before using destructors" << endl;
    cout << "---------------------------------"<< endl;

    book1.pre_destructor();

    cout << "After using destructors" << endl;
    cout << "---------------------------------";

    return 1;

}
Run Code Online (Sandbox Code Playgroud)

对于上述程序,显示了两个错误.一个是在声明对象的main函数中; 错误:内容中的错误.第二个是在调用构造函数的行中; 错误:Book :: Book()是私有的.

主要不是直接访问代码中的构造函数.那为什么会显示访问错误?

Ada*_*dam 7

不,public构造函数不是强制性的.私有构造函数有用例.

  • 仅具有静态方法的类可能具有private(或删除)构造函数以防止创建实例.
  • 单例类(其中只存在一个类的实例)可以通过使用private构造函数来强制执行其单例状态.该实例可以通过staticgetter 访问.
  • 您可能希望遵循构建器或工厂模式,在此模式下,您强制用户使用调用构造函数旁边的过程构造实例.该构建器或工厂将是该类的成员或a friend,因此能够调用private构造函数.这种方案在Java中比C++更常见,但C++也允许它.

也就是说,您只想构建一个类的实例:

Book book1;
Run Code Online (Sandbox Code Playgroud)

这种用法肯定需要一个public默认的构造函数.