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++中默认的等号操作符也是浅拷贝,只是把指针的内存地址拷贝了,但没有开辟对应的内存空间。

 

posted @ 2018-12-29 10:46  深度机器学习  阅读(794)  评论(0编辑  收藏  举报