在类的成员函数中,可以访问到同类对象的的私有属性
一:拷贝构造函数:
面试-什么时候需要将参数声明为常引用?
- & 防止形参实参结合时调用 拷贝构造函数
- const 防止传入的实参 在函数执行过程中被改变
1- 什么时候调用:
- 用一个对象初始化另一个对象时
- 函数的参数是类的对象,在函数调用 形参实参结合时
- 函数的返回值是类的对象,在函数调用完成返回时
2- 注意:
- 性能消耗大,形参实参结合时常为了避免调用拷贝构造函数而使用 本类对象的常引用
- 在需要实现深拷贝时重写拷贝构造函数和赋值构造函数
class MyVector {
private:
// 当类中有指针型成员变量时,要重写拷贝构造函数+赋值函数
int *vecPtr;
int maxSize;
int nowSize;
public:
// Constructors 构造函数
MyVector(int defaultSize = 4):nowSize(0), maxSize(defaultSize) {
vecPtr = new int[this->maxSize];
}
// 拷贝构造函数
MyVector(const MyVector& g) {
this->nowSize = g.nowSize; // 传入的对象,的私有成员,可以在类中的函数被访问到
this->maxSize = g.maxSize;
this->vecPtr = new int[g.maxSize];
// 拷贝多少个字节过来 -> 要用到 sizeof
memcpy(this->vecPtr, g.vecPtr, nowSize * sizeof(int));
}
// 拷贝构造函数和赋值函数,参数为本类对象的常引用
// 用一个对象给另一个对象赋值时调用赋值函数,(另一个对象已经存在)
// 要连续 赋值(a = b = c; ),所以返回值 要为 常引用
MyVector& operator=(const MyVector& g) {
// 1-先判断是不是自己, 防止 出现 v = v;
if (this == &g) {
return *this;
}
// 2-释放原先对象的内存
delete[] this->vecPtr;
this->nowSize = g.nowSize; // 传入的对象,的私有成员,可以在类中的函数被访问到
this->maxSize = g.maxSize;
this->vecPtr = new int[g.maxSize];
// 3-拷贝多少个字节过来 -> 要用到 sizeof
memcpy(this->vecPtr, g.vecPtr, nowSize * sizeof(int));
// 4-返回 *this
return *this;
}
};
二:赋值函数:
1-定义方式
- 1-先判断是不是自己, 防止 出现 v = v;
if (this == &g) { return *this; }
- 2-释放原先对象的内存
delete[] this->vecPtr;
- 3-拷贝多少个字节过来 -> 要用到 sizeof 以及 string.h 库中的 memcpy(目的地址,源地址, 字节数)
memcpy(this->vecPtr, g.vecPtr, nowSize * sizeof(int));
- 4-返回 *this
return *this;
2-什么时候调用?
MyVector v1, v2; // 调用构造函数
MyVector v3 = v1; // 调用拷贝构造函数
v2 = v1; // 调用赋值函数
3-函数头:
- 返回值为 本类对象的引用
- 参数为 本类对象的常引用
**MyVector& operator=(const MyVector& g) **