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 ; }
补充: