C++的复制构造
由于C++中链表节点是由程序员动态分配空间及释放的,所以链表实现集合时就需要析构函数来对不需要使用的对象进行空间的释放。当进行对象与对象间的复制时有两种情况,分别是浅层复制和深层复制。
浅层复制可以用类自带的拷贝构造函数实现,当使用浅层复制时,编译器自带的拷贝构造函数只是将目标对象的地址传给当前对象,所以两个对象指向的是同一个内存地址。当一个对象对数据进行操作时同时也意味着改变了另一个对象的域。
深层复制需要用户自定义拷贝构造函数。在本例中,由于链表结构在对象生命周期结束后会被析构函数释放,所以如要进行对象复制,则需要为当前对象的域动态分配空间,然后将目标对象对应的值赋值给当前对象相应的变量。
下例是作业中需要实现的一个集合类,用链表实现,集合运算采用普通函数的方式。
//
// main.cpp
// CppCP4_2
//
// Created by Chenjun Xiong on 2017/3/30.
// Copyright © 2017年 Chenjun Xiong. All rights reserved.
//
//集合运算(链表实现)
//
//题目描述
//请设计实现集合类,元素类型为整形, 集合采用带头结点单链表表示。该集合类支持集合元素增加、删除、查询;并支持集合并、交、差运算(作为类成员函数);利用你设计的集合类,实现本题要求。程序应体现面向对象程序设计思想,结构合理。为保证结果唯一,集合元素递增排列。如需用到拷贝构造和赋值应重载. 空间应正确释放.。要求并、交、差运算结果先保存在集合对象内,再利用集合显示功能显示。
//
//输入描述
//开始为两个正整数m,n;后续m个整数构成集合A,再后续n个整数构成集合B
//
//输出描述
//集合A、B和他们的并、交、差集;每个集合元素间以,分隔;不同集合显示在不同行
//
//输入样例
//3 5
//1 2 3
//3 5 8 2 1
//
//输出样例
//{1,2,3}
//{1,2,3,5,8}
//{1,2,3,5,8}
//{1,2,3}
//{}
#include <iostream>
using namespace std;
typedef struct Vnode{
int data;
Vnode* next;
}*Node;
class Vector{
private:
Node head;
int size;
public:
Vector();
Vector(const Vector &rpt);//复制构造函数
void Insert(int ele);
void Delete(int ele);
int GetElement(