Chinaunix首页 | 论坛 | 博客
  • 博客访问: 300059
  • 博文数量: 148
  • 博客积分: 4365
  • 博客等级: 上校
  • 技术积分: 1566
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-05 21:38
文章分类
文章存档

2014年(2)

2013年(45)

2012年(18)

2011年(1)

2009年(54)

2008年(28)

我的朋友

分类: C/C++

2008-11-07 10:58:56

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

使用这样的容器

ary<base> con(5);

也会因为没有给构造函数传递参数而报错


3.虚拟继承中虚基类的初始化会让人有点晕,增加了风险。


综合的感觉是提倡带默认参数的构造函数,减少派生类程序员的麻烦和误用。

阅读(657) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~