关于C++ 中构造函数限定符的使用是一个比较让人头疼的问题,但是清楚了类的作用就比较好办了。通常设计一个类时,会涉及到“向用户开放哪些属性,操作,作为抽象类,基类,单例,多例”等等问题。
public限定符就不再赘述,属于最简单,最open的限定符。
下面就通过private,protected对构造函数的限定来看看其起到的作用。
private,protected对构造函数的限定,就可以防止外部直接new一个该类对象.
从语法上来讲,一个函数被声明为protected或者private,那么这个函数就不能从“外部”直接被调用了。对于protected的函数,子类的“内部”的其他函数可以调用之,
而对于private的函数,只能被本类“内部”的其他函数说调用。
private作为最严格的限定符,如果限定了构造函数,那么该类就不能在外部被创建,也不能被继承,相当于密封了,只能通过该类内部的静态方法(getInstance()方法)
来获取该对象,通常用private限定构造函数,那么该类通常被设计成单例模式。
如果不像完全封闭该类,则可以考虑用protected来限定其构造函数,那么这个类一般作为基类或者父类被继承使用的,因为其在外部不能被创建,只能在其子类当中被创建,
类似天生做父类的材料。
实例代码如下:
Class A
{
protected: // protected类型构造函数
A(){cout<<"construct!!!\n";}
public:
void show()
{
.....
}
}
Class B :public A
{
public:
B()
{
A();// 调用父类的构造函数,因为父类构造函数的方位修饰符为protected
}
void function()
{
A* pa = new A;// 父类的protected构造函数,在子类当中可以被调用
pa->show();
}
}
void main(void)
{
B* pb = new B;// OK
A* pa = new A;// 类A的构造函数为protected类型,在外部不能被构造,只能在子类当前被调用,故此处错误
A a; // error
}