总的一句话概括:限制创建那些完全没有初始化的对象。那种对象没意义。所以我们要尽量限制掉默认构造函数,自己写一个带参数的初始化构造函数。
首先需要知道的是我们是在什么样的情况下才需要限制对象的创建。限制对象的创建不代表我们想禁止创建对象,只是加以限制而已,限制创建对象时能够按照我们需要的那样创建,而不能随意的创建对象。
比如下面代码,我们定义了一个book类,声明对象的时候自然是为了描述某一本具体的书,这个时候如果我们直接采用book a;这样的方式创建一个对象a,编译当然是不会有问题的,毕竟系统会自动生成默认构造函数的。但是这样创建的对象a能代表什么呢?指的又是哪一本书?完全不清楚!
class book
{
public:
void setprice(double a);
double getprice();
void settitle(char* a);
char * gettitle();
void display();
private:
double price;
char * title;
};
解决方法:
1、不声明默认构造函数:
class book
{
public:
book(char *a, double p);
void setprice(double a);
double getprice();
void settitle(char* a);
char * gettitle();
void display();
private:
double price;
char * title;
};
2、将默认构造函数声明为 private:
class book
{
public:
book(char *a, double p);
void setprice(double a);
double getprice();
void settitle(char* a);
char * gettitle();
void display();
private:
book(){}
double price;
char * title;
};
根据上面的几个例子,我们将系统不会自动生成默认构造函数的情况总结如下:
- 类中显式地声明了默认构造函数,无论其属性被设置为public、private还是protected,系统都不会再自动生成默认构造函数了。
- 类中显式地声明了其它任意一个不是默认构造函数的构造函数,系统均不会再自动生成默认构造函数。
其实这两点可以总结为一点,那就是当类中显示地声明了任意一个构造函数,系统均不会再自动生成构造函数。