自学内容网 自学内容网

【C++】拷贝构造

一种特殊的构造函数,用自身这种类型来构造自身

Student stu1;
Student stu2=stu1;//调用拷贝构造
  • 如果类中没有自定义拷贝构造,类中会自动提供一个默认拷贝构造
  • 如果类中定义了自定义拷贝构造,类中不会提供默认拷贝构造

自定义拷贝构造

类名(const 类名& 引用名){}

const 是为了防止被更改

示例:

class Student{
    int id;
    public:
    Student(const student& stu){
        this->id = stu.id;
    }
}

this->id看不懂的先看:【C++】this指针

拷贝构造的调用

(1)

Student stu1;
Student stu2=stu1;//隐式调用拷贝构造
Student stu3(stu2);//显式调用拷贝构造
Student *stup=new Student(stu3);

(2)在函数传参时,函数的形参是类对象:void fun(Student stu){}

fun(stu1);//在函数调用传参时调用拷贝构造

(3)如果一个函数的返回值类型是对象,在函数调用结束,返回对象的时候调用拷贝构造

Student fun1(Student stu){return stu;}

这里在函数调用的时候会调用两次拷贝构造,函数传参一次,函数返回时一次


默认拷贝构造不会重新给指针开辟内存,这种形式称为“浅拷贝”;会造成重复释放动态内存问题(两个指针的地址指向同一个内存)

如果类中成员有开辟动态内存的,就要重写拷贝构造,给新对象的指针重新开辟动态内存,这种形式称为“深拷贝

示例:

#include<iostream>
class Student {
    char* name;
public:
    Student(){}
    Student(char* name) {
        this->name = new char[strlen(name) + 1];
        strcpy_s(this->name, strlen(name) + 1, name);
    }
    Student(const Student& stu) {
        this->name = new char[strlen(stu.name) + 1];
        strcpy_s(this->name, strlen(stu.name) + 1, stu.name);
    }
    void callName() {
        std::cout << this->name << std::endl;
    }
};
int main() {
    char arr[] = "Root";
    char* ptr = arr;
    Student stu1(ptr);
    stu1.callName();
    Student stu2(stu1);
    stu2.callName();
}

如果2个程序单元(例如2个函数)是通过拷贝它们所共享的数据的指针来工作的,这就是浅拷贝;因为真正要访问的数据并没有被拷贝。

如果被访问的数据被拷贝了,在每个单元中都有自己的一份,对目标数据的操作相互不受影响,则叫做深拷贝。

Copy00


原文地址:https://blog.csdn.net/qq_45951891/article/details/143889051

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!