《C/C++学习指南》语法篇—笔记 (二十、拷贝构造函数)
拷贝构造函数是一种特殊的构造函数:
- 是构造韩叔叔,函数名的类名、没有返回值
- 特殊的构造函数,参数形式的固定的
const Object(类名)& other
class Object
{
public:Object(const Object& other);
};
作用:以一个对象为蓝本,来构造另一个对象,a是b的一个拷贝/备份,两者内容完全相同。
Object b;
Object a(b); //或写成 Object a = b;
拷贝构造函数的调用,不显式调用,三种情况:定义对象,动态创建对象,函数的传值调用
Object a;
Object b(a); Object b = a;Object a;
Object* p = new Object(a);void Test(Object obj);
上面为构造(创建对象时候给初始值,拷贝构造函数被调用),区分赋值,下面为赋值(不会调用拷贝构造函数)
Object a(1,2);
Object b;
b =a;
在拷贝构造函数,可以访问参数对象的任意成员,因为是同类,访问不受限制
Object (const Object& other)
{this->a = other.a;this->b = other.b;
}
默认拷贝构造函数,当没有写,编译器会提供一个默认的,将每一个成员逐个拷贝。除非必要,不用添加拷贝构造函数。
写拷贝构造函数的时候注意的两点:
- 所有成员变量依次拷贝
- 调用父类的拷贝构造函数
只有在下面情况才需要自己添加拷贝构造函数:深度拷贝和浅拷贝
class Text
{
public:Text(const char* str){//申请一块内存,保存此字符串m_size = strlen(str)+1;m_buf = new char[m_size];strcpy(m_buf,str);}~Text(){//释放此字符串delete [] m_buf;}
private:int m_size;char* m_buf;
}
浅:
Text(const Text& other)
{m_size = other.m_size;m_buf = other.m_buf; //这个只是把这个的地址指向了要拷贝的地址,不行
}
深度:
Text(const Text& other)
{m_size = other.m_size;m_buf = new char[m_size];strcpy(m_buf,other.m_buf); //这个只是把这个的地址指向了要拷贝的地址,不行
}