西南科技大学C++程序设计实验三(类与对象二)
一、实验目的 1.理解类的复制构造函数的定义、说明与使用 2.扩充类的数据成员,为其增加静态数据成员、常(const)成员、其他类定义的成员等 3.理解组合类的相关知识点 二、实验任务
(1)思考并实验验证程序,若注释掉复制构造函数student (student &C),是否还可以实现一个用对象初始化赋值另一对象?为什么? 可以。如果没有自定义的复制构造函数,编译器会使用默认的复制构造函数,这个默认的复制构造函数也能够实现一个对象初始化赋值给另一个对象。 (2)根据无参构造函数的实现方法,完善其有参构造函数、复制构造函数的实现; student(int b, char* cstr)//有参构造函数 } (3)观察析构函数的输出,看对象c,c2,c3数据成员 str指针所指的地址是否相同?如果没有复制构造函数会出现什么结果? 对象c,c2,c3的数据成员str指针所指的地址是不同的。如果没有复制构造函数,使用默认的复制构造函数,对象c3的str指针将指向与对象c2相同的地址,当c2和c3被销毁时,由于它们共享同一块内存空间,会导致错误的内存释放。因此,为了避免这种情况,需要自定义深度复制的复制构造函数。 (4)主函数中添加语句,使用sizeof()函数计算student类型的字节数并输出,分析指针的字节大小? 输出为8个字节,指针的字节大小与操作系统位数相关。在 32 位系统中,指针占用 4 个字节,在 64 位系统中,指针占用 8 个字节。 (5)思考并查阅资料回答:深复制与浅复制的概念?区别?为什么深复制一定要有自定义的复制构造函数? 浅复制只复制指针本身,而不是指针所指向的内容。被复制对象的所有变量都含有与原来对象相同的值,而所有其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间。 深复制被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制的新对象,而不再是原有的那些被引用的对象。换言之,深复制把复制的对象所引用的对象都复制了一遍。深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。在对象复制给对象的过程中就要用到拷贝构造函数,到底是自己定义拷贝构造函数还是使用默认拷贝构造函数,这就要看看这个被拷贝的对象是否占有资源,如果占有资源,我们要把资源也复制一份给新对象,而不是把使用被拷贝对象使用资源的“权限”复制给新对象。 #include <iostream> using namespace std; class student { private: int a;//学号 char* str;//姓名 public: student(int b, char* cstr)//有参构造函数 { cout<<"有参构造函数:学号及姓名\n"; a = b; str = new char[b];// new为动态申请内存运算,其返回值为指针(地址) str=cstr; } student() //无参构造函数 { cout<<"无参构造函数:学号及姓名\n"; cin>>a; str = new char[10]; cin >> str; } student(const student& C)//思考1:此处复制参构造函数是否可以注释掉?当一个对象赋值给另外一个对象时采用系统默认的构造函数? { cout<<"复制构造函数:学号及姓名\n"; a = C.a; str = new char[10]; str=C.str; |