我有一个班级:
class Cat {
Cat();
Tail longTail;
}
我不确定为它编写构造函数的正确方法。我不想让longTail成为非相关原因的指针。
Cat::Cat() : longTail(length) {...}
那个不适合因为长度是在构造函数中计算的,基于创建时的静态成员值; (上游不良做法);
问题是
Cat::Cat()
{
int length;
...
longTail = Tail(length);
}
Tail 对象的创建和复制发生了多少次?它们对于创建和复制都是昂贵的CPU,我需要数千只猫。在我看来,这个构造函数首先在 longTail 中创建一个默认的 Tail 对象,然后在赋值右侧创建noname Tail对象,然后在上运行operator = > longTail 和noname Tail 。我对吗?如果是,我该如何编写它以保留CPU?我再说一遍: longTail 需要一个在构造函数中计算的参数,我无法编辑 Tail 类。
答案 0 :(得分:8)
在您的第二个版本中,您的Tail
- 对象将在构造函数体运行之前进行默认初始化。在正文中,您创建第二个Tail
- 对象并将其分配给第一个。
要在初始化列表中启用正确的构造,可以将参数的计算包装在静态成员函数中(因为,正如您所说,它仅取决于静态成员):
class Cat {
public:
Cat() : longTail(calculateLength()) {...}
private:
static int calculateLength() {}
答案 1 :(得分:0)
在我看来,这个构造函数首先在longTail中创建一个默认的Tail对象,然后在赋值的右边创建noname Tail对象,然后在longTail和noname Tail上运行operator =。我是对的吗?
是
如果是,我该如何编写它以保留CPU?
可能的选择:不要分配到longTail
,填写longTail
:
longTail.resize (length); // or longTail.reserve (length); longTail.append (x).
您是否拥有可用于测试代码的实际数据集?
您是否尝试过分析代码?