• C++(二十七) — 深拷贝、浅拷贝、复制构造函数举例


    1、复制构造函数、及new空间申请

      复制构造函数,也是构造函数。只在初始化时调用,如果定义对象后赋值,比如,t1=t2,则只是运算符重载,没有调用构造函数。

    注意:

        (1)复制构造函数是函数的形参是类的对象的引用的构造函数;

        (2)用一个已经存在的对象,初始化一个新的同类对象;

        (3)系统会自动生成一个默认复制构造函数,将成员一一复制;

        (4)类的数据成员包含指针变量,构造函数用 new 为其申请空间,必须在复制构造函数中为新对象申请新的堆空间

    #include <iostream>;
    #include<string>
    using namespace  std;
    
    class student
    {
    public:
        student(int,char*, int, float);
        student(student&);
        ~student();
        void printstu();
    private:
        int id, age;
        char* name;
        float score;
    };
    // 构造函数
    student::student(int i, char *c, int a, float s)
    {
        cout << "Constructing...." << endl;
        id = i; age = a;
        score = s;
        name = new char[strlen(c) + 1];
        if (name != 0)
            strcpy_s(name, strlen(c) + 1, c);
    }
    // 复制构造函数
    student::student(student& s)
    {
        cout << "Copy Constructing...." << endl;
        id = s.id; age = s.age;
        score = s.score;
        name = new char[strlen(s.name) + 1];
        if (name != 0)
            strcpy_s(name, strlen(s.name) + 1, s.name);
    }
    // 析构函数
    student::~student()
    {
        cout << "Destructing..." << endl;
        delete []name;  // 释放申请的内存空间
        name = 0;
    }
    void student::printstu()
    {
        cout << "学号:" << id << "        姓名:" << name << endl;
        cout << "年龄:" << age << "    成绩:" << score << endl;
    }
    
    void main()
    {
        student s1(1, "wang", 18, 86);
        s1.printstu();
        student s2(s1);// 调用复制构造函数
    
        system("pause");
        return;
    }

    2、浅拷贝、深拷贝

      指对于类或结构体这类复合类型的变量。当类的成员变量中含有指针或引用时,在赋值或初始化过程中,若只修改指针指向,没有开辟新的空间,则是浅拷贝;(因为所指内容空间只有一份,若其中一个变量销毁时,空间释放,则另一个变量就出现指针悬挂问题)。

      深拷贝:开辟另一个内存空间(在堆内存中),将内容复制过去。这样就存在两个内存空间,保存相同内容。

       C++中默认的等号操作符也是浅拷贝,只是把指针的内存地址拷贝了,但没有开辟对应的内存空间。

  • 相关阅读:
    Hybrid App(二)Cordova+android入门
    Hybrid App(一)App开发选型
    redis(一)Windows下安装redis服务、搭建redis主从复制
    玩转Nuget服务器搭建(三)
    玩转Nuget服务器搭建(二)
    玩转Nuget服务器搭建(一)
    Topshelf+Quartz.net+Dapper+Npoi(二)
    MySQL练习
    用过哪些SpringBoot注解
    Java 将数据写入全路径下的指定文件
  • 原文地址:https://www.cnblogs.com/eilearn/p/10187850.html
Copyright © 2020-2023  润新知