1.深浅拷贝
- 如果一个类中有指针,那么就意味着有类外资源(内存)存在
- 需要考虑深浅拷贝的问题
- 必须重写析构函数
2. 默认浅拷贝:
- . 只复制指针,没复制真正的内存
class A
{
int size;
int *p;
public:
A(const A &r)
{
size=r.size;
// 默认浅拷贝: 只复制指针,没复制真正的内存
p = r.p;
}
// 3,赋值操作符函数
// 赋值操作符函数会默认将所有的类成员复制一份
A & operator=(const A &r)
{
// 浅拷贝
size = r.size;
p = r.p;
return *this;
}
};
3.深拷贝:
- 复制真正的内存
class A
{
int size;
// 如果一个类中有指针,那么就意味着有类外资源(内存)存在
// 此时需要注意几点:
// 1,需要考虑深浅拷贝的问题
// 2,必须重写析构函数
int *p;
public:
// 类中默认就有的东西:
// 1,无参构造函数
A(){}
A(int s):size(s){p = new int[size];}
~A(){delete [] p;}
// 2,拷贝构造函数(即参数为本类对象的构造函数)
// 拷贝构造函数会默认将所有的类成员复制一份
A(const A &r)
{
size = r.size;
// 默认浅拷贝: 只复制指针,没复制真正的内存
// p = r.p;
// 深拷贝: 复制真正的内存
p = new int[size];
memcpy(p, r.p, size*sizeof(int));
}
// 3,赋值操作符函数
// 赋值操作符函数会默认将所有的类成员复制一份
A & operator=(const A &r)
{
// 浅拷贝
// size = r.size;
// p = r.p;
// 深拷贝
size = r.size;
delete [] p;
p = new int[r.size];
memcpy(p, r.p, size*sizeof(int));
return *this;
}
};
3.this 指针
- 任何类方法,都有一个默认的隐藏指针: this
- this指针就指向调用该类方法的对象