我有一节课:
class Cat {
Cat();
Tail longTail;
}
Run Code Online (Sandbox Code Playgroud)
我不确定为它编写构造函数的正确方法.我不想让longTail成为非相关原因的指针.
Cat::Cat() : longTail(length) {...}
Run Code Online (Sandbox Code Playgroud)
那个不合适,因为长度是在构造函数中计算的,基于创建时的静态成员值; (上游不良做法);
问题是
Cat::Cat()
{
int length;
...
longTail = Tail(length);
}
Run Code Online (Sandbox Code Playgroud)
Tail对象的创建和复制发生了多少次?它们对于创建和复制都是昂贵的CPU,我需要数千只猫.在我看来,这个构造函数首先在longTail中创建一个默认的Tail对象,然后在赋值的右边创建noname Tail对象,然后在longTail和noname Tail上运行operator = .我对吗?如果是,我该如何编写它以保留CPU?我再说一遍:longTail需要一个参数,它是在构造函数中计算的,我无法编辑Tail类.
在第二个版本中,您的Tail-object将在构造函数体运行之前进行默认初始化.在正文中,您创建第二个对象Tail并将其分配给第一个对象.
要在初始化列表中启用正确的构造,可以将参数的计算包装在静态成员函数中(因为,正如您所说,它仅取决于静态成员):
class Cat {
public:
Cat() : longTail(calculateLength()) {...}
private:
static int calculateLength() {}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |