这有什么危险吗?我不知道其他的做法,但似乎非常可疑。
class cA
{
public:
cA(){}
~cA(){}
int a;
//say class have tons of members..
};
int _tmain( int argc, _TCHAR* argv[] )
{
cA obj;
cA *ptr = new cA;
*ptr = obj;
//ofc there is a 'delete ptr;' after
}
如果我在C ++上记得正确,这意味着将创建cA
的对象并且ptr
将指向它,我必须这样做以插入长寿容器({{1} })。
是否将obj的内容从堆栈复制到有效的堆?
vector<cA*>
答案 0 :(得分:2)
这不是一种危险的做法,但如果您是cA
的班级作者,请覆盖operator=
,以便它能够正确复制。
同样沿着这些行,实现一个复制构造函数。
答案 1 :(得分:2)
而不是这种形式:
cA obj;
cA *ptr = new cA;
ptr->Copy( obj );
为什么不用这种形式?
cA obj;
cA *ptr = new cA(ob);
您的复制构造函数将如下所示。还应该有一个赋值运算符。
class cA
{
public:
cA(){}
CA(const cA& ref)
{
a = ref.a;
}
~cA(){}
cA& operator=(const cA& p) {
if (this != &p) { // make sure not same object
a = p.a;
}
return *this; // Return ref for multiple assignment
}
int a;
};
之前你所做的并不危险,但也许有点难以理解。
答案 2 :(得分:1)
没关系。但这取决于。
如果您的类是普通的旧数据类型(例如,如果它是所有简单,非指针或非资源管理成员),则您不需要实现复制构造函数或赋值运算符。比如说,如果cA
只包含一堆浮点数,整数和bool,你需要简单地复制每个成员的值,那么自动编译器生成的复制构造函数就可以了。
但是,如果它拥有指向某个内部资源的指针,那么您需要实现一个复制构造函数和赋值运算符,以正确处理底层资源的复制(“深层”复制)。
如果您计划继承cA
,则只需要一个虚拟析构函数。否则,您只是无缘无故地将vtable指针膨胀添加到类的每个实例。如果你不打算继承子类,并且正在使用C ++ 11,你可以将你的类设置为final
,这意味着如果有人试图继承cA
,你不必担心虚拟析构函数问题。无论如何(它会给他们一个编译错误)。
此外,在创建新类时,可以帮助实现自动将复制构造函数和赋值运算符声明为private
。然后,当您尝试执行复制分配时,您会收到编译器错误,此时您可以删除声明以允许编译器生成自动版本。通过这种方式,您可以对如何使用类进行更多控制和反馈,并且可以避免以后出现意外情况。