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