Bite Copy Semantics (位逐次拷贝)
1.Default Constructor
将class 对象中的值原原本本的copy到另一个对象中。
产生的问题:
class A{
public:
/*
//在bitwise copy semantics时注释,表示没有构造函数
A()
{
m_pData = new int;
}
//这里的初始化顺序是先初始化m_data,再初始化m_index。按照变量声明的顺序。
A(int data,int index):m_index(index),m_data(data)
{
}
*/
~A()
{
delete m_pData;
}
private:
int m_data;
int m_index;
int * m_pData;
};
这里当:
int main()
{
` A a1;
A a2 = a1;
return 0;
}
会报错,原因是a2 - a1;进行bitwise copy semantics;在执行析构函数的时候m_pData被delete两次。
什么时候不进行bitwise
copy semantics:
1)当A类有成员变量是B类对象,并且B类含有默认构造函数
2)类的基类有默认构造函数时
3)类中存在虚函数
4)虚基类
virtual public Base(虚基类作用是去掉多继承中重名的变量和重名的方法名称)
5)类没有copy
constructor
2.Copy
Constructor
什么时候不进行bitwise
copy semantics:
1)class中含有的成员对象B
b; 类B中声明有Copy constructor
2)class继承的基类有Copy
constructor
3)class有virtual
function时
4)class继承的基类有virtual
function
如果class出现了bitwise
copy semantics时,就不会为我们产生Default/Copy Constructor
所以,对象传递一般用 指针、引用或重写copy constructor。而不是浅拷贝。
本文探讨了位拷贝语义(Bitwise Copy Semantics)带来的问题,特别是重复释放内存导致的程序错误。文章详细分析了在C++中实现深拷贝的必要性,包括如何避免位拷贝语义的陷阱,以及何时不会发生位拷贝。同时介绍了深拷贝构造函数的作用和使用场景。
586

被折叠的 条评论
为什么被折叠?



