📜  构造函数可以在C++中私有吗?

📅  最后修改于: 2021-05-30 04:52:03             🧑  作者: Mango

先决条件:建设者
构造函数是类的特殊成员函数,用于初始化类的对象。在C++中,创建类的对象时会自动调用构造函数。

默认情况下,构造函数在类的public部分中定义。那么,问题是可以在class的private部分中定义构造函数吗?
回答:是的,可以在类的私有部分中定义构造函数

如何在专用部分中使用构造函数?

  1. 使用Friend类:如果我们希望该类不应被其他任何人实例化,而只能由一个朋友类实例化。
    // CPP program to demonstrate usage of 
    // private constructor
    #include 
    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;
    }
    

    输出:

    constructor of A
    constructor of B
    

    如果您注释线路朋友类B ,则会遇到以下错误:

    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. 使用Singleton设计模式:当我们要设计Singleton类时。这意味着,不是由几个类的对象创建系统,而是由单个对象或数量非常有限的对象来驱动系统。
  3. 命名构造函数成语:由于构造函数的名称与类相同,因此不同的构造函数的参数列表有所不同,但是如果构造函数的数量更多,则实现可能会容易出错。

    使用命名构造器惯用语,您可以在私有或受保护的部分中声明该类的所有构造器,然后为访问类的对象而创建公共静态函数。

    例如,考虑下面的CPP程序

    // CPP program to demonstrate
    // ambiguous nature of constructor
    // with same no of parameters of same type
    #include 
    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;
    }
    

    命名构造器惯用语可以解决此问题。上述CPP程序可以进行以下改进:

    // CPP program to demonstrate
    // named constructor idiom
    #include 
    #include 
    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 <y1 <

    输出 :

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

参考 :
1)命名构造器成语
2)构造函数可以在cpp中私有吗

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”