¿Puede un constructor ser privado en C++?

Requisito previo: Constructores
Un constructor es una función miembro especial de una clase que inicializa objetos de una clase. En C++, el constructor se llama automáticamente cuando se crea el objeto de una clase.

Por defecto, los constructores se definen en la sección pública de la clase. Entonces, la pregunta es ¿se puede definir un constructor en la sección privada de la clase?
Respuesta: Sí, el Constructor se puede definir en la sección privada de la clase.

¿Cómo usar Constructores en la sección privada?

  1. Uso de Friend Class: si queremos que esa clase no sea instanciada por nadie más, sino solo por una clase amiga.

    // CPP program to demonstrate usage of 
    // private constructor
    #include <iostream>
    using namespace std;
      
    // class A
    class A{
    private:
        A(){
           cout << "constructor of A\n";
        }
        friend class B;
    };
      
    // class B, friend of class A
    class B{
    public:
        B(){
            A a1;
            cout << "constructor of B\n";
        }
    };
      
    // Driver program
    int main(){
        B b1;
        return 0;
    }

    Producción:

    constructor of A
    constructor of B
    

    Si comenta la clase de amigo de línea B , encontrará el siguiente error:

    test1.cpp: In constructor ‘B::B()’:
    test1.cpp:9:5: error: ‘A::A()’ is private
         A(){
         ^
    test1.cpp:19:11: error: within this context
             A a1;
    
  2. Usando el patrón de diseño Singleton: Cuando queremos diseñar una clase singleton . Esto significa que en lugar de crear varios objetos de clase, el sistema está dirigido por un solo objeto o un número muy limitado de objetos.
  3. Modismo de constructor con nombre: dado que el constructor tiene el mismo nombre que la clase, los diferentes constructores se diferencian por su lista de parámetros, pero si el número de constructores es mayor, la implementación puede volverse propensa a errores.

    Con Named Constructor Idiom, declara todos los constructores de la clase en las secciones privadas o protegidas, y luego, para acceder a los objetos de la clase, crea funciones estáticas públicas.

    Por ejemplo, considere a continuación el programa CPP

    // CPP program to demonstrate
    // ambiguous nature of constructor
    // with same no of parameters of same type
    #include <iostream>
    using namespace std;
    class Point 
    {
        public:
          
        // Rectangular coordinates
        Point(float x, float y);     
          
        // Polar coordinates (radius and angle)
        Point(float r, float a);     
          
        // error: ‘Point::Point(float, float)’ cannot
        // be overloaded
    };
    int main()
    {
        // Ambiguous: Which constructor to be called ?
        Point p = Point(5.7, 1.2); 
        return 0;
    }

    Este problema se puede resolver con Named Constructor Idiom. El programa CPP anterior se puede mejorar de la siguiente manera:

    // CPP program to demonstrate
    // named constructor idiom
    #include <iostream>
    #include <cmath>
    using namespace std;
    class Point 
    {
        private:
        float x1, y1;
        Point(float x, float y)
        {
            x1 = x;
            y1 = y;
        };
    public:
        // polar(radius, angle)
        static Point Polar(float, float); 
          
        // rectangular(x, y)
        static Point Rectangular(float, float); 
        void display();
    };
      
    // utility function for displaying of coordinates
    void Point::display()
    {
        cout << "x::" << this->x1 <<endl;
        cout << "y::" << this->y1 <<endl;
    }
      
    // return polar coordinates
    Point Point::Polar(float x, float y)
    {
        return Point(x*cos(y), x*sin(y));
    }
      
    // return rectangular coordinates
    Point Point::Rectangular(float x, float y)
    {
        return Point(x,y);
    }
    int main()
    {
        // Polar coordinates
        Point pp = Point::Polar(5.7, 1.2);
        cout << "polar coordinates \n";
        pp.display();
          
        // rectangular coordinates
        Point pr = Point::Rectangular(5.7,1.2);
        cout << "rectangular coordinates \n";
        pr.display();
        return 0;
    }

    Producción :

    polar coordinates 
    x::2.06544
    y::5.31262
    rectangular coordinates 
    x::5.7
    y::1.2
    

Referencias:
1) Modismo de constructor
con nombre 2) ¿Puede un constructor ser privado en cpp?

Este artículo es una contribución de Mandeep Singh . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *