成员初始化列表 const 和引用

来源:互联网 发布:js date 格式化 编辑:程序博客网 时间:2024/05/07 13:20

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

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

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

如果namedptr<t>对象包含一个现有名字的引用,情况会非常不同。但还是要在构造函数的初始化列表里对引用进行初始化。还可以对名字同时声明const和引用,这样就生成了一个其名字成员在类外可以被修改而在内部是只读的对象。

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

private:
  const string& name;               // 必须通过成员初始化列表
                                    // 进行初始化

  t * const ptr;                    // 必须通过成员初始化列表
                                    // 进行初始化
};

通过成员初始化列表来进行初始化总是合法的,效率也决不低于在构造函数体内赋值,它只会更高效。另外,它简化了对类的维护。

---------------------------------------

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

void manydatambrs::init()
{
  a = b = c = d = e = f = g = h = 1;
  i = j = k = l = m = 0;
}

manydatambrs::manydatambrs()
{
  init();

  ...

}