分类: C/C++
2007-03-07 14:42:55
这样一个类模板 namedptr
template
class namedptr {
public:
namedptr(const
string& initname, t *initptr);
...
private:
string name;
t *ptr;
};
在写这个类模板的构造函数时,必须将参数值传给相应的数据成员。有两种方法来实现。
第一种方法是使用成员初始化列表:
template
namedptr
: name(initname), ptr(initptr)
{}
第二种方法是在构造函数体内赋值:
template
namedptr
{
name = initname;
ptr = initptr;
}
两种方法有重大的不同。
有些情况下必须用初始化:const成员只能被初始化,不能被赋值。所以,如果想让namedptr
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)
{ ... }