zoukankan      html  css  js  c++  java
  • c++ ,protected 和 private修饰的构造函数

    c++ 

    protected 和 private修饰的构造函数:

    1.在类的外部创建对象时,不能调用protected或private修饰的构造函数。

    2.当子类中的构造函数调用父类的private构造函数时会错,当子类中的构造函数调用父类中的 public或protected构造函数时是对的。

    #include <iostream>
    using namespace std;
    
    
    ////////////////////////////////////////////////
    class A {
    public:
        A();
    protected:
        A(int x);
    private:
        A(int x, int y);
    };
    A::A() {
        cout<<"A::A() public"<<endl;
    }
    A::A(int x) {
        cout<<"A(int x) protected"<<endl;
    }
    A::A(int x, int y) {
        cout<<"A(int x,int y) private"<<endl;
    }
    ////////////////////////////////////////////////
    class B:public A {
    public:
        B();
        B(int x);
        //B(int x , int y);
        void show();
    };
    B::B(): A() {//public A()
    
    }
    B::B(int x): A(x) {//子类中的构造函数可调用父类的protected构造函数
    
    }
    
    //当子类中的构造函数调用父类的private构造函数时会错
    // error C2248: “A::A”: 无法访问 private 成员(在“A”类中声明)
    // B::B(int x, int y): A(x,y){ 
    // 
    // }
    
    ////////////////////////////////////////////////
    void f1() 
    {
        A a1;            // A::A() public
        //    A a2(1);    //error:在类的外部创建对象时,不能调用protected或private修饰的构造函数。
        //    A a3(1,2);    //error:在类的外部创建对象时,不能调用protected或private修饰的构造函数。
        B b1(33);       // A(int x) protected
    }
    
    int main()
    {
        f1();
    
        while(1);
        return 0 ;
    }

    那么,private构造函数怎么才能被用到呢?

    两种方法:

    1、使用友元类的对象中的方法来创建它。

    2、在本类中实现static方法来创建它。

    #include <iostream>
    using namespace std;
    #include <string>
    
    //友元创建:
    class pri_class
    {
        friend class pub_class;
    private:
        pri_class();
    };
    pri_class::pri_class()
    {
        cout<<"a new pri_class is created"<<endl;
    }
    class pub_class { public: pri_class* create_pri_class() { return new pri_class; } }; //static 创建: class pri_class_2 { public: static pri_class_2* NewInstance(string h ); pri_class_2(); private: pri_class_2(string h); }; pri_class_2::pri_class_2() { cout<<"a new pri_class_2 is created"<<endl; } pri_class_2* pri_class_2::NewInstance(string h) { cout<<h<<"I am going to create a new pri_class_2!" <<endl; return new pri_class_2; } //---------------------------------------------------------------------- void func(void) { pub_class fire; pri_class *pri_ptr = fire.create_pri_class();//a new pri_class is created pri_class_2 pri2;//a new pri_class_2 is created string str("coco"); pri2.NewInstance(str); //coco ,I am going to create a new pri_class_2!   //a new pri_class_2 is created
    }
    int main() { func(); while(1); return 0 ; }
     

    补充:

    构造函数定义为private,protected http://www.cnblogs.com/this-543273659/archive/2011/08/02/2125487.html

  • 相关阅读:
    Lua 语言环境安装
    python __init__.py 的作用
    python functiontools模块中的 wraps
    函数装饰器、类装饰器
    redis pipline 和 事务
    Innodb中的行锁与表锁
    mongoengine 分页 切片与 skip + limit 的区别
    python 可变类型传的内存地址, 不可变类型在传递的时候传的是值
    PHP常用人工智能库
    PHP批量给目录下所有的文件转换编码
  • 原文地址:https://www.cnblogs.com/mylinux/p/4095473.html
Copyright © 2011-2022 走看看