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 ;
}