当前位置: 首页 > article >正文

西南科技大学C++程序设计实验三(类与对象二)

一、实验目的

1.理解类的复制构造函数的定义、说明与使用

2.扩充类的数据成员,为其增加静态数据成员、常(const)成员、其他类定义的成员等

3.理解组合类的相关知识点

二、实验任务

  1. 阅读分析、完善程序。下面是一个学生类student的定义,数据成员包括一个代表姓名字符个数的整形变量和一个代表姓名的字符串指针变量,现要求:

(1)思考并实验验证程序,若注释掉复制构造函数student (student &C),是否还可以实现一个用对象初始化赋值另一对象?为什么?

可以。如果没有自定义的复制构造函数,编译器会使用默认的复制构造函数,这个默认的复制构造函数也能够实现一个对象初始化赋值给另一个对象。

(2)根据无参构造函数的实现方法,完善其有参构造函数、复制构造函数的实现;

student(int b, char* cstr)//有参构造函数
{
    cout<<"有参构造函数:学号及姓名\n";
    a = b;
    str = new char[strlen(cstr) + 1]; 
    strcpy(str, cstr); // 深复制
}

student(const student& C)//复制构造函数
{
    cout<<"复制构造函数:学号及姓名\n";
    a = C.a;
    str = new char[strlen(C.str) + 1];
    strcpy(str, C.str); // 深复制

}

(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;


http://www.kler.cn/a/154925.html

相关文章:

  • JavaScript 自动化软件:AutoX.js
  • 【Linux】系统中负责回收内存的进程和机制有哪些?
  • 基于Java Springboot快递物流管理系统
  • 解读Nature:Larger and more instructable language models become less reliable
  • 使用 Vision 插件让 GitHub Copilot 识图问答
  • 网络延迟对Python爬虫速度的影响分析
  • hbase Master is initializing
  • 分布式事务有哪些解决方案?
  • 力扣labuladong一刷day24天
  • MySQL 教程 1.5
  • 同旺科技 USB TO SPI / I2C --- 调试W5500_Ping测试
  • 工业机器视觉megauging(向光有光)使用说明书(一,轻量级的visionpro)
  • java中@Async注解在CompletableFuture.runAsync里面使用没有生效的原因?
  • Java项目调用C/C++ SDK的方案汇总
  • 力扣题:字符串的反转-11.23
  • 盘点25个Html游戏Game源码网页爱好者不容错过
  • 前端面试JS— JS数据类型及相关内容
  • Linux 基础认识
  • 【每日一题】拼车+【差分数组】
  • DQN原理及PyTorch实现【强化学习】
  • java使用poi读写excel(处理上下标和科学计数法)
  • PriorityQueue类
  • 大数据基础设施搭建 - 业务数据同步策略
  • Linux shell中的函数定义、传参和调用
  • c++的函数对象和适配器
  • 目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】单目视觉估计