燕山大学-面向对象程序设计实验-实验三 类和对象—构造函数与析构函数-实验报告

CSDN的各位友友们你们好,今天千泽为大家带来的是
燕山大学-面向对象程序设计实验- 实验三 类和对象 —构造函数与析构函数,
接下来让我们一起进入c++的神奇小世界吧,相信看完你也能写出自己的 实验报告!
如果对您有帮助的话希望能够得到您的支持和帮助,我会持续更新的!

🚀3.1 实验目的

1.理解掌握this指针的作用和用法;

2.理解掌握构造函数的定义和作用;

3.掌握构造函数的使用;

4.理解掌握拷贝构造函数的定义和使用;

5.理解掌握构造函数的重载;

6.理解掌握析构函数的定义和使用。

🚀3.2 实验内容

🚀3.2.1程序阅读

1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。

#include <iostream>

class CPoint

{

public:

       void Set(int x,int y);

       void Print();

private:

       int x;

       int y;

};

void CPoint::Set(int x,int y)

{

       x = x;

       y = y;

}

void CPoint::Print()

{

       cout<<"x="<<x<<",y="<<y<<endl;

}

void main()

{

       CPoint pt;

       pt.Set(10,20);

       pt.Print();

}

🚩问题一:以上程序编译能通过吗,试解释该程序?

答:补充声明命名空间using namespace std后,编译可以通过,但结果不正确。程序在CPoint类中对成员变量和成员函数进行了声明,随后在CPoint类外对成员函数Set和Print进行了实现。在main函数中,构CPoint类对象pt,随后调用pt.Set和pt.Print完成了成员变量赋值和输出。

🚩问题二:以上程序的运行结构是否正确,如果不正确,试分析为什么,应该如何改正?

答:运行结果不正确。原因为成员函数Set的形参和成员变量名重名,均为x和y,系统未赋值。输出时的变量值为随机值。需要将Set的形参改一下名字,修改后代码如下:
#include <iostream>
 
using namespace std;
 
 
 
class CPoint{
 
    public:
 
        void Set(int x,int y);
 
        void Print();
 
    private:
 
        int x;
 
        int y;
 
};
 
 
 
void CPoint::Set(int _x,int _y){
 
    x = _x;
 
    y = _y;
 
}
 
 
 
void CPoint::Print(){
 
    cout<<"x="<<x<<",y="<<y<<endl;
 
}
 
 
 
int main(){
 
    CPoint pt;
 
    pt.Set(10,20);
 
    pt.Print();
 
}

🚀2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。

#include <iostream>

class CPerson

{

public:

       void Print();

private:

       CPerson();

private:

       int age;

       char *name;

};

CPerson::CPerson()

{

}

void CPerson::Print()

{

       cout<<"name="<<name<<",age="<<age<<endl;

}

void main()

{

       CPerson ps(23,"张三");

       ps.Print();

}

🚩问题一:以上程序存在三处大错误,在不改变主函数内容的前提下,试改正该程序。

#include <iostream>
 
using namespace std;
 
 
 
class CPerson{
 
    public:
 
        void Print();
 
        CPerson(int age,char*name);//构造函数应该为public,且应该有参数
 
    private:
 
        int age;
 
        char *name;
 
};
 
 
 
CPerson::CPerson(int _age,char*_name){//构造函数需要代码实现
 
    age=_age;
 
    name=_name;
 
}
 
 
 
void CPerson::Print(){
 
    cout<<"name="<<name<<",age="<<age<<endl;
 
}
 
 
 
int main(){
 
    CPerson ps(23,"张三");
 
    ps.Print();
 
}

🚀3.2.2 程序设计

1.设计实现一个CPoint类,满足以下要求:

a. 该类包含两个整型成员变量x(横坐标)和y(纵坐标),以及一个输出函数Print()用来输出横坐标和纵坐标,要求不可以在类的外部直接访问成员变量;

b.可以采用没有参数的构造函数初始化对象,此时的成员变量采用默认值0;

c.可以采用直接输入参数的方式来初始化该类的成员变量;

d.可以采用其它的CPoint对象来初始化该类的成员变量;

e.设计一个主函数来测试以上功能。

答:

#include <iostream>
 
using namespace std;
 
 
 
class CPoint{
 
    private:
 
        int x;
 
        int y;
 
    public:
 
        void Print(){
 
            cout<<"横坐标为 "<<x<<endl;
 
            cout<<"纵坐标为 "<<y<<endl;
 
        }
 
        CPoint(int _x=0,int _y=0){
 
            x=_x;
 
            y=_y;
 
        }
 
        CPoint(CPoint &a){
 
            x=a.x;
 
            y=a.y;
 
        }
 
        void Set(int _x,int _y){
 
            x=_x;
 
            y=_y;
 
        }
 
};
 
 
 
int main(){
 
    CPoint c1;//无参数构造函数,默认初始化成员变量值为0
 
    c1.Print();
 
   
 
    CPoint c2(1,2);//带参数构造函数初始化成员变量值
 
    c2.Print();
 
   
 
    CPoint c3;//使用成员函数Set设置成员变量
 
    c3.Set(3,4);
 
    c3.Print();
 
   
 
    CPoint c4(c3);//使用其他CPoint对象初始化成员变量
 
    c4.Print();
 
    return 0;
 
}

🚀3.3思考题

1.设计一个CStudent(学生)类,并使CStudent类具有以下特点:

a.该类具有学生姓名、学号、程序设计、信号处理、数据结构三门课程的成绩;

b.学生全部信息由键盘输入,以提高程序的适应性;

c.通过成员函数统计学生平均成绩,当课程数量增加时,成员函数无须修改仍可以求取平均成绩;

d.输出学生的基本信息、各科成绩与平均成绩;

e.学生对象的定义采用对象数组实现;

f.统计不及格学生人数。

答:

#include<iostream>
 
#include<cstring>
 
#include<string>
 
#include<cstdlib>
 
using namespace std;
 
const int N = 30;
 
int StuNum;
 
 
 
class CStudent{
 
    private:
 
        string name;
 
        int age;
 
        int courseNum;
 
        double courseScore[10];
 
        string courseName[10];
 
    public:
 
        CStudent(){
 
        }
 
        CStudent(string _name,int _age,int _courseNum,double *_courseScore,string *_courseName){
 
            name=_name;
 
            age=_age;
 
            courseNum=_courseNum;
 
            for(int i=0;i<courseNum;i++){
 
                courseScore[i]=_courseScore[i];
 
                courseName[i]=_courseName[i];
 
            }
 
        }
 
        double getAverage(){
 
            double all=0;
 
            for(int i=0;i<courseNum;i++)
 
                all+=courseScore[i];
 
            return all/courseNum;
 
        }
 
        void printAverage(){
 
            cout<<"Average:"<<getAverage()<<endl;
 
        }
 
        void printScores(){
 
            for(int i=0;i<courseNum;i++)
 
                cout<<courseName[i]<<":"<<courseScore[i]<<endl;
 
        }
 
        void printInfo(){
 
            cout<<"Name:"<<name<<endl;
 
            cout<<"Age:"<<age<<endl;
 
            cout<<"CourseNum:"<<courseNum<<endl;
 
            printScores();
 
            printAverage();
 
        }
 
        int noPassNum(CStudent *stu,int n){
 
            int num=0;
 
            for(int i=0;i<n;i++){
 
                for(int j=0;j<stu[i].courseNum;j++){
 
                    if(stu[i].courseScore[j]<60){
 
                        num++;
 
                        break;
 
                    }
 
                }
 
            }
 
            return num;
 
        }
 
};
 
 
 
int main(){
 
    cout<<"请输入学生数量:";
 
    cin>>StuNum;
 
    CStudent stu[N];
 
   
 
    string name;
 
    int age;
 
    int courseNum;
 
    double courseScore[10];
 
    string courseName[10];
 
    for(int i=0;i<StuNum;i++){
 
        memset(courseScore,0,sizeof(courseScore));
 
        for(int j=0;j<10;j++)
 
            courseName[j]="";
 
        cout<<"请输入第"<<i+1<<"位同学的信息"<<endl;
 
        cout<<"请输入姓名、年龄、修读课程数目,以空格分割"<<endl;
 
        cin>>name>>age>>courseNum;
 
        cout<<"请输入修读课程名称和该课程分数,以空格分割。不同课程之间以回车分割。"<<endl;
 
        for(int j=0;j<courseNum;j++){
 
            cin>>courseName[j]>>courseScore[j];
 
        }
 
        stu[i]=CStudent(name,age,courseNum,courseScore,courseName);
 
    }
 
    system("cls");
 
    cout<<"共有"<<StuNum<<"名同学"<<",其中有"<<stu[0].noPassNum(stu,StuNum)<<"名同学不及格!"<<endl;
 
    cout<<"各同学详细信息如下:"<<endl;
 
    cout<<"****************************"<<endl;
 
    for(int i=0;i<StuNum;i++){
 
        stu[i].printInfo();
 
        cout<<"****************************"<<endl;
 
    }
 
    system("pause");
 
    return 0;
 
}

今天的分享就到这里啦,小伙伴们要多多动手实践练习哦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/850.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

硬刚ChatGPT!文心一言能否为百度止颓?

引言&#xff1a;近年来&#xff0c;人工智能领域的发展突飞猛进&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;方面。OpenAI的ChatGPT无疑是这个领域的佼佼者[1]。那么&#xff0c;面对这样一款高度智能的AI模型&#xff0c;国内市场上是否有相应的产品能与之抗…

你是真的“C”——指针进阶知识分享【上篇】

你是真的“C”——指针进阶知识分享【上篇】&#x1f60e;前言&#x1f64c;指针初阶必备小知识~&#x1f60a;一. 字符指针&#x1f60a;二. 指针数组&#x1f60a;三、数组指针&#x1f60a;数组指针的定义&#x1f618;四、 &数组名VS数组名&#x1f60a;总结撒花&#…

【K8S系列】从零开始学习 k8s:入门指南(二)

目录 序言 前情提要&#xff1a; 4.K8S架构 4.1 声明式系统VS命令式系统 4.2 k8s-声明式系统 4.2.1 声明方式-yaml 4.3 Kubernetes的基本概念 1.集群 2.节点 3.容器 4.Pod 5.Service 6.Deployment 问题&#xff1a; 4.4 K8S核心组件 4.4.1 kube-apiserver 4.4…

【Linux学习】进程间通信——system V(共享内存 | 消息队列 | 信号量)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 进程间通信——共享内存 | 消息队列 | 信号量&#x1f3c0;共享内存⚽系统调用shmgetkey值⚽系统…

提升Python代码性能的六个技巧

文章目录前言为什么要写本文&#xff1f;1、代码性能检测1.1、使用 timeit 库1.2、使用 memory_profiler 库1.3、使用 line_profiler 库2、使用内置函数和库3、使用内插字符串 f-string4、使用列表推导式5、使用 lru_cache 装饰器缓存数据6、针对循环结构的优化7、选择合适算法…

【WEB前端进阶之路】 HTML 全路线学习知识点梳理(下)

前言 本文是HTML零基础小白学习系列的第三篇文章&#xff0c;点此阅读 上一篇文章 文章目录前言十五.HTML布局1.使用div元素添加网页布局2.使用table元素添加网页布局十六.HTML表单和输入1.文本域2.密码字段3.单选按钮4.复选框5.提交按钮十七.HTML框架1.iframe语法2.iframe设置…

Windows电脑密码忘记解决方法

目录 背景 方法一 方法二 方法三 方法四 方法五 背景 个人电脑忘记了密码&#xff0c;无法登录用户界面。 方法一 1. 开机时常按 F11&#xff0c;如果是Win10一下系统&#xff0c;就常按 F8&#xff0c;知道出现一下图状 2. 选择疑难解答&#xff0c;再选择高级选项 3.…

Tomcat前端页面部署

一&#xff0c;Tomcat的安装1.Tomcat是什么Tomcat是一个HTTP服务器&#xff0c;HTTP协议是HTTP客户端和HTTP服务器之间交换数据的格式&#xff0c;我们可以通过ajax和Java Socket分别构造HTTP客户端&#xff0c;同时HTTP服务器也可以通过Java Socket来实现&#xff0c;而Tomcat…

React项目规范:目录结构、根目录别名、CSS重置、路由、redux、二次封装axios

React项目&#xff08;一&#xff09;一、创建项目二、目录结构三、craco配置别名并安装less1.craco安装2.配置别名3.安装less四、CSS样式重置五、配置路由六、配置Redux1.创建大仓库2.创建小仓库&#xff08;1&#xff09;方式1&#xff1a;RTK&#xff08;2&#xff09;方式2…

toString()、equals()是什么,为啥需要重写,多种方法来重写

https://m.runoob.com/java/java-object-class.html toString() 1.为什么会有toString 子类继承父类就可以使用父类所有非私有的属性的方法。 在Java中所有类都直接或者间接继承Object类&#xff0c;可以说只要是Object类里面定义的非私有的属性和方法&#xff0c;任何类都可…

Linux上如何使用Stable Diffusion WebUI

在我把所有的坑都踩了一遍之后&#xff0c;决定记录一下linux上的Stable Diffusion webui是怎么搞的。 前提条件 已安装CUDA 已安装git 已安装Anaconda 直接安装Anaconda不要指望Linux自带的Python。虽然Linux自带的Python&#xff0c;但是缺胳膊少腿&#xff0c;所以还是直接…

IntelliJ IDEA创建Servlet

目录 ——————————————————————————————— 一、创建Java项目 1、创建java项目 2、选择java 3、next 4、给项目命名 5、新创建完java项目的目录结构 二、变java为servlet项目 1、变servlet项目 2、选择Web Application 3、更新完成后的目录…

尚融宝04-mybatis-plus插件和条件构造器

目录 一、分页插件 1、添加配置类 2、添加分页插件 3、测试分页 二、XML自定义分页 1、UserMapper中定义接口方法 2、定义XML 3、测试 三、乐观锁 1、场景 2、乐观锁方案 3、乐观锁实现流程 4、优化流程 四、wapper介绍 1、Wrapper家族 2、创建测试类 五、Qu…

Linux驱动开发

一、驱动分类Linux中包含三大类驱动&#xff1a;字符设备驱动、块设备驱动和网络设备驱动。其中字符设备驱动是最大的一类驱动&#xff0c;因为字符设备最多&#xff0c;从led到I2C、SPI、音频等都属于字符设备驱动。块设备驱动和网络设备驱动都要比字符设备驱动复杂。因为其比…

线程的状态

目录 1.线程状态的种类 2.线程的状态图 3.状态的详细说明 1.线程状态的种类 初始(NEW):新建一个线程,但还没有调用start方法 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态统称为"运行".线程对象创建后,其他线程调用了该对象的start()方法.该…

抽丝剥茧还原真相,记一次神奇的崩溃

作者&#xff1a;靳倡荣 本文详细回放了一个崩溃案例的分析过程。回顾了C多态和类内存布局、pc指针与芯片异常处理、内存屏障的相关知识。 一、不讲“武德”的崩溃 1.1 查看崩溃调用栈 客户反馈了一个崩溃问题&#xff0c;并提供了core dump文件&#xff0c;查看崩溃调用栈如下…

大数据-重新学习hadoop篇(第一天)-未完成

前言&#xff1a;首先这次重新学习为了后面校招&#xff0c;我会把我每天复习学到的一些觉得重要的知识点进行总结下来&#xff0c;持续更新&#xff0c;为实习做准备&#xff0c;加深记忆&#xff0c;从今天开始可能就不会法leetcode的相关题解了&#xff0c;但是每天还是会做…

【动态规划】不同路径,编辑距离题解及代码实现

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

【前端】深入浅出缓存原理

缓存的基本原理 对于前端来说&#xff0c;缓存主要分为浏览器缓存&#xff08;比如 localStorage、sessionStorage、cookie等等&#xff09;以及http缓存&#xff0c;也是本文主要讲述的。 当然叫法也不一样&#xff0c;比如客户端缓存大概包括浏览器缓存和http缓存 所谓htt…

“选用育留”,让AI搞定人力资源那点事

人工智能可以渗透应用到各行各业&#xff0c;在人力资源领域&#xff0c;技术已经重构了我们对人力资源的想象力&#xff0c;许多企业都在应用AI技术改善人力工作&#xff0c;人力资源的数智化不仅仅是将一部分日常事务性的工作交由AI处理&#xff0c;节约工作时间&#xff0c;…