当前位置: 代码迷 >> 综合 >> 《C/C++学习指南》语法篇—笔记 (二十、拷贝构造函数)
  详细解决方案

《C/C++学习指南》语法篇—笔记 (二十、拷贝构造函数)

热度:87   发布时间:2024-02-08 15:04:31.0

《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);  //这个只是把这个的地址指向了要拷贝的地址,不行
}