C++中如果我们没有为类定义自己的构造函数,编译器会为该类提供一个
无参数的默认构造函数,有时会带来一些实际问题。比如有一个通讯录联系人类,创建对象时要提供联系人的ID,空的联系人对象没有任何意义。但是如果我们定义了带参数的构造函数,有时创建对象会略微麻烦
class base{
public:
base(int i):id(i){};
int id;
};
|
1.使用数组时
base ary[5];
base *pt_b=new ary[5];
|
这两种情况都会由于没有传递构造函数的参数而导致编译报错,如果不嫌麻烦对第一种情况可以
base ary[]={
base(1);
base(2);
//...
};
|
但是对于第二种情况堆区数组则无能为力了。
实在想用堆区数组,则只能通过创建base的指针数组了
base * pt_b=new pt_ary[5];
for(int i=0;i<5;i++)
pt_ary[i]=new base(/*构造参数*/);
|
但是这样一来对于数组中的每个指针在最终delete,否则导致内存泄漏;二来程序所需的内存空间增大,不仅要存储创建出的对象,还要存储指向它们的指针。
2.使用需要模板参数的容器
通常容器的模板如下:
template<class T>
class ary{
public:
ary(int size);
private:
T* data;
};
template<class T>
ary<T>::ary(int size){
data = new T[size];
}
|
使用这样的容器
也会因为没有给构造函数传递参数而报错。
3.虚拟继承中虚基类的初始化会让人有点晕,增加了风险。
综合的感觉是提倡带默认参数的构造函数,减少派生类程序员的麻烦和误用。
阅读(657) | 评论(0) | 转发(0) |