Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1666092
  • 博文数量: 607
  • 博客积分: 10031
  • 博客等级: 上将
  • 技术积分: 6633
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-30 17:41
文章分类

全部博文(607)

文章存档

2011年(2)

2010年(15)

2009年(58)

2008年(172)

2007年(211)

2006年(149)

我的朋友

分类: C/C++

2007-03-07 14:42:55

条款12: 尽量使用初始化而不要在构造函数里赋值

条款13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同


这样一个类模板 namedptr

template
class namedptr {
public:
  namedptr(const string& initname, t *initptr);
  ...

private:
  string name;
  t *ptr;
};

在写这个类模板的构造函数时,必须将参数值传给相应的数据成员。有两种方法来实现。

第一种方法是使用成员初始化列表

template
namedptr::namedptr(const string& initname, t *initptr  )
: name(initname), ptr(initptr)
{}

第二种方法是在构造函数体内赋值

template
namedptr::namedptr(const string& initname, t *initptr)
{
  name = initname;
  ptr = initptr;
}

两种方法有重大的不同。

有些情况下必须用初始化:const成员只能被初始化,不能被赋值所以,如果想让namedptr对象不能改变它的名字或指针成员,就必须遵循条款21的建议声明成员为const:

template
class namedptr {
public:
  namedptr(const string& initname, t *initptr);
  ...

private:
  const string name;
  t * const ptr;
};

这个类的定义要求使用一个成员初始化列表,因为const成员只能被初始化,不能被赋值。

但有一种情况下,对类的数据成员用赋值比用初始化更合理:这就是当有大量的固定类型的数据成员要在每个构造函数里以相同的方式初始化的时候例如,这里有个类可以用来说明这种情形:

class manydatambrs {
public:
  // 缺省构造函数
  manydatambrs();

  // 拷贝构造函数
  manydatambrs(const manydatambrs& x);

private:
  int a, b, c, d, e, f, g, h;
  double i, j, k, l, m;
};

假如想把所有的int初始化为1而所有的double初始化为0,那么用成员初始化列表就要这样写:

manydatambrs::manydatambrs()
: a(1), b(1), c(1), d(1), e(1), f(1), g(1), h(1), i(0),
  j(0), k(0), l(0), m(0)
{ ... }

manydatambrs::manydatambrs(const manydatambrs& x)
: a(1), b(1), c(1), d(1), e(1), f(1), g(1), h(1), i(0),
  j(0), k(0), l(0), m(0)
{ ... }

这将会非常难以维护!
阅读(582) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~