C++中的构造函数是实例化一个类时被调用的函数。如果将构造函数私有化,那么实例化一个类的过程将无法调用该构造函数,从而导致编译错误,因为无法实例化该类。
下面是两条示例说明:
示例一
首先,我们定义一个Student类,并将构造函数设置为私有:
#include <iostream>
using namespace std;
class Student {
public:
static Student* createInstance() {
if (instance == NULL) {
instance = new Student();
}
return instance;
}
private:
Student() {} //将构造函数设置为私有
static Student* instance;
};
Student* Student::instance = NULL;
int main() {
Student* s = Student::createInstance();
return 0;
}
在main函数中,我们调用了Student类的静态方法createInstance()去实例化一个Student的对象。可以看到,在这个方法中,我们通过new语句创建了一个Student对象。
但是,由于构造函数是私有的,我们无法在实例化类的时候直接调用它。那么,我们该如何实例化一个Student对象呢?
我们定义了一个静态方法createInstance(),该方法定义了一个静态类成员instance,并检查它是否为NULL。如果instance为NULL,说明我们还没有实例化,于是我们通过new语句创建一个Student对象,然后将它赋值给instance,并将其返回。注意,由于我们在定义createInstance()方法时使用了static关键字,所以我们可以在不实例化Student类的情况下通过类名直接调用该方法。
这种方法就是所谓的“单例模式”,即在程序运行期间只实例化一个类的对象,避免了类的多次实例化带来的问题。
示例二
定义一个Date类,其成员变量包含年、月、日,其中月和日的范围均是1~12和1~31。我们通过对构造函数私有化,来实现对日期的有效性检查。
#include <iostream>
using namespace std;
class Date {
public:
static Date* createDate(int year, int month, int day) {
if (instance == NULL) {
instance = new Date(year, month, day);
}
return instance;
}
void printDate() {
cout << year << "-" << month << "-" << day << endl;
}
private:
Date(int year, int month, int day) {
this->year = year;
if (month < 1) {
this->month = 1;
} else if (month > 12) {
this->month = 12;
} else {
this->month = month;
}
if (day < 1) {
this->day = 1;
} else if (day > 31) {
this->day = 31;
} else {
this->day = day;
}
}
static Date* instance;
int year;
int month;
int day;
};
Date* Date::instance = NULL;
int main() {
Date* d1 = Date::createDate(2021, 4, 31);
d1->printDate(); //输出:2021-4-31
Date* d2 = Date::createDate(2021, 2, 29);
d2->printDate(); //输出:2021-2-29
Date* d3 = Date::createDate(2021, 13, 32);
d3->printDate(); //输出:2021-12-31
return 0;
}
在上面代码中,我们首先将构造函数设置为私有,然后定义了静态方法createDate(),该方法返回一个Date对象,并检查输入的年月日是否合法。在检查完毕后,我们通过new语句创建一个Date对象,并将其赋值给instance,最后将其返回。
这样一来,我们就可以通过createDate()方法来实例化一个Date对象,而不必担心用户输入的数据是否合法。我们只需在构造函数中检查一遍日期的有效性就好了。
在main函数中,我们调用了createDate()方法三次,分别传入了4月31日、2月29日和13月32日这三个日期,输出到控制台上的日期分别为2021-4-31、2021-2-29和2021-12-31,可以看到,之所以能够输出这些日期,是因为在构造函数中,我们通过有效性检查,将那些不合法的日期修正为了合法日期。
这种方法同样使用了单例模式的思想,保证了在程序运行期间只实例化了一个Date对象,并且实例化的对象的日期信息均是合法的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++探索构造函数私有化会产生什么结果 - Python技术站