• 构造函数可以在类的私有部分中定义吗?


    传送门 ==>> AutoSAR入门和实战系列总目录*

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

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

    1如何在私有部分使用构造函数?

    1.1 使用朋友类

    使用朋友类:如果我们希望该类不应该由其他任何人实例化,而只能由朋友类实例化。

    // 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    输出:

    constructor of A
    constructor of B
    
    • 1
    • 2

    如果您注释掉 friend class 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.2 使用单例设计模式

    使用单例设计模式:当我们想要设计一个单例类时。这意味着系统不创建多个类对象,而是由单个对象或非常有限数量的对象驱动。

    1.3 使用 Named Constructor Idiom

    Named Constructor Idiom :由于构造函数与类同名,不同的构造函数通过参数列表来区分,但是如果构造函数的数量更多,那么实现容易出错。
    使用 Named Constructor Idiom,您可以在私有或受保护部分中声明所有类的构造函数,然后为了访问类的对象,您可以创建公共静态函数。

    例如,考虑下面的 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    这个问题可以通过命名构造函数来解决。上述 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 <<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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    输出 :

    polar coordinates 
    x :: 2.06544
    y :: 5.31262
    rectangular coordinates 
    x :: 5.7
    y :: 1.2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    网页开发从无到有——html前端学习(四)
    性能测试中,TPS和RT之间的关系,你知道吗?
    房地产小程序 | 小程序赋能,房地产业务数字化升级
    什么是SDN?用一篇文章彻底讲明白 SDN 软件定义网络是什么!
    C#/.NET/.NET Core优秀项目和框架2023年10月简报
    唐山海德教育成人高考
    Rider 中C#单元测试
    AtCoder Beginner Contest 232(A-G)
    spark withColumn的使用(笔记)
    系列二、什么是OOM?什么是StackOverflowError?有哪些方法分析?
  • 原文地址:https://blog.csdn.net/huihuige092/article/details/126490534