【带头学C++】----- 九、类和对象 ---- 9.1 类和对象的基本概念----(9.1.1---9.1.3)

目录

9.1 类和对象的基本概念

9.1.1 类的封装性

9.1.2 定义类的步骤和方法

9.1.3 设计一个学生类 Student


9.1 类和对象的基本概念

9.1.1 类的封装性

       类是一种用户自定义的数据类型,它定义了一组数据成员和成员函数。类可以看作是一个模板或者蓝图,用于创建对象。类将具有共性的数据和方法封装在一起,加以权限区分,用户只能通过公共方法 访问私有数据。 

     这里我的另外一个理解是这样的:类就像是一个学生类别、每个具体的张三、李四学生就是一个对象,对象就有不同的属性,不同的姓名、身高、体重、性别、年龄这些特征,比如张三会武术、李四会跳舞、王五会吃土等等,你的类就是相当于一个空白的模板,把这些属性汇合到一起以后,同过这个类名称来创建张三、李四对象,每一个对象都可以拥有不一样的身高体重等等,这里只是举个例子,实际上类和对象的作用比上面说的要大很多。并且类中的不同函数、方法的权限不一,更加的多元化,满足不同需求。

       对象则是类的实例化结果,它是类的具体实体,具有类定义中定义的数据成员和行为(成员函数)。

       我们编写程序的目的是为了解决现实中的问题,而这些问题的构成都是由各种事物组成,我们在计算机中要解决这种问题,首先要做就是要将这个问题的参与者:事和物抽象到计算机程序中,也就是用程序语言表示现实的事物。那么现在问题是如何用程序语言来表示现实事物?现实世界的事物所具有的共性就是每个事物都具有自身的属性,一些自身具有的行为,所以如果我们能把事物的属性和行为表示出来,那么就可以抽象出来这个事物。
      类的权限分为: private (私有)、protected (保护) 、public (公有) 3种权限。

       在类的外部,只有public修饰的成员才能被访问,在没有涉及继承与派生时,private和protected是同等级的,外部不允许访问。用户在类的外部可以通过public的方法间接访问private和protected数据

9.1.2 定义类的步骤和方法

定义类的关键字:class

设计一个类步骤: 思考该类有哪些数据成员 操作这些数据的成员函数 数据一般默认都是设计成私有, 成员函数为公有,通过成员函数操作数据,来实现对类和对象的一些操作。

注意,私有、保护成员变量不能直接在类的外部进行访问 

完整代码:

#include <iostream>

using namespace std;

class Data{
    //类中默认为私有
private:
    int a; //私有成员变量,不用给类中成员初始化
protected:
    int b;//受保护的成员变量
public:
    int c;//公有的成员变量
    //在类的内部,不分权限之分
    void printData(void){
        cout << a << " " << b << " " << c <<endl;
    }
};


int main()
{
    //用类实例化一个对象
    Data dataer;
    //类外部(“{}”介于花括号之间的属于类的内部)不能直接访问私有、受保护的成员变量
//    cout << dataer.a <<endl;
//    cout << dataer.b <<endl;
    cout << dataer.c <<endl;

    //类中的成员函数,需要通过对象名来调用
    dataer.printData();

    return 0;
}

9.1.3 设计一个学生类 Student

题目:学生信息管理系统

设计一个学生类 Student,包含以下成员:

数据成员:

  • 学生姓名(name)
  • 学生学号(id)

成员函数:

  • 构造函数:带有学号和姓名的参数列表,用于初始化学生对象的数据成员。
  • void setInfo(const std::string& n, const std::string& i):设置学生的姓名和学号。
  • std::string getName():返回学生的姓名。
  • std::string getId():返回学生的学号。

根据上述要求,设计并实现 Student 类,然后编写一个测试程序,在测试程序中创建多个学生对象,并调用相应的成员函数来设置和获取学生的姓名和学号。

完整代码:


#include <iostream>
#include <string>

class Student {
private:
    std::string name; // 学生姓名
    std::string id; // 学生学号
public:
    // 构造函数,用于初始化学生对象的数据成员
    Student(const std::string& n, const std::string& i) {
        name = n;
        id = i;
    }
    // 设置学生的姓名和学号
    void setInfo(const std::string& n, const std::string& i) {
        name = n;
        id = i;
    }
    // 返回学生的姓名
    std::string getName() {
        return name;
    }
    // 返回学生的学号
    std::string getId() {
        return id;
    }
};

void test02(){
    // 创建两个学生对象,分别设置姓名和学号
    Student student1("Alice", "12345");
    Student student2("Bob", "67890");

    // 输出学生1的姓名和学号
    std::cout << "Student 1: " << student1.getName() << " (" << student1.getId() << ")" << std::endl;
    // 输出学生2的姓名和学号
    std::cout << "Student 2: " << student2.getName() << " (" << student2.getId() << ")" << std::endl;

    // 更新学生1的姓名和学号
    student1.setInfo("Eve", "54321");

    // 输出更新后的学生1的姓名和学号
    std::cout << "Student 1 (updated): " << student1.getName() << " (" << student1.getId() << ")" << std::endl;

}

引用千峰教育C++基础班笔记案例和内容,并作了补充和修改

案例:

      请设计一个Person类,Person类具有name和age属性,提供初始化函数(nit),并提供对name和age的读写函数(set,get),但必须确保age的赋值在有效范围内(0-100),超出有效范围,则拒绝赋值,并提供方法输出姓名和年龄。

说明:

代码:(原出处中对代码的标准使用是基于C++98版本的,所以我这里此后全部基于C++11以及11以上的标准进行改写,说明,同时能直接掌握c++11标准用法)

class Person
{
private:
    const char *m_Name;//私有的   c++11标准使用 const char *修饰字符串
    int m_Age;//成员变量
public:
    //初始化函数
    void personInit(const char *name,int age){
       // strcpy(m_Name,name);
        m_Name = name;
        if(age > 0 && age <= 100){
            m_Age = age;
        }else{
            cout << "输入的年龄:"<<m_Age<<"不合法"<<endl;
        }
    }
    //设置m_Age年龄
    void setAge(int age){
        if(age > 0 && age <= 100){
            m_Age = age;
        }else{
            cout << "输入的年龄:"<<m_Age<<"不合法"<<endl;
        }
    }
    int getAge(void){
        return m_Age;
    }
    //设置m_Name
    void setName(const char *name){
        //strcpy_s(m_Name,name);
        m_Name = name;
    }
    //得到m_Name
    const char *getName(void){
        return m_Name;
    }

    //显示年龄和姓名
    void showPerson(){
        cout<<"姓名:"<<m_Name<<" 年龄:"<<m_Age;
    }
};

void test03(){
    Person spike;
    spike.personInit("name",18);
    spike.setName("肉丝");
    spike.setAge(16);
    cout<<spike.getName()<<""<<spike.getAge()<<endl;
    spike.showPerson();
}

Result:

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

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

相关文章

echarts实现3D柱状图

效果如图 let setData function(data, constData, showData) {data.filter(function(item) {if (item) {constData.push(1);showData.push(item);} else {constData.push(0);showData.push({value: 1,itemStyle: {normal: {borderColor: "rgba(0,0,0,0)",borderWidt…

BUUCTF [GXYCTF2019]BabySQli 1 详解!(MD5与SQL之间的碰撞)

题目环境burp抓包 随便输入值 repeater放包 在注释那里发现某种编码 MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5 看着像是base编码格式 通过测试发现是套加密&#xff08;二次加密&#xff09; 首先使用base32对此编码…

修复 Apache Kafka 中的远程代码执行漏洞CVE-2023-25194

文章目录 前言一、Log4Shell connection二、DisclosureUpdates, mitigations 前言 Possible RCE and denial-of-service issue discovered in Kafka Connect 在 Kafka Connect 中发现可能的 RCE 和拒绝服务问题。 更新 阿帕奇软件基金会 (ASF) 已解决了一个漏洞&#xff0c;…

enum常用方法 - Java

六、enum常用方法 0、准备工作1、name()2、ordinal()3、values()4、valueOf()5、compareTo()6、toString() 说明&#xff1a;使用关键字enum时&#xff0c;会隐式 继承 Enum类&#xff0c;这样我们就可以使用 Enum 类相关的方法。 0、准备工作 enum Season2 {SPRING("…

富必达API:一站式无代码开发集成电商平台、CRM和营销系统

一站式无代码开发的连接解决方案 电子商务、客户服务系统以及其它商业应用&#xff0c;是现代企业运营的重要部分。然而&#xff0c;将这些系统进行有效的整合往往需要复杂的API开发&#xff0c;这对很多企业来说是一个巨大的挑战。富必达API以其一站式的无代码开发解决方案&a…

一键上传,无限容量!打造高效图床工具,利用Electron和Gitee搭建自己的私人云存储空间

说在前面 平时写文章或写代码的时候&#xff0c;都少不了需要将本地图片转成在线图片链接&#xff0c;大家都是使用什么工具进行转换的呢&#xff1f;相信很多人都有自己的图床工具&#xff0c;今天来给大家介绍一下&#xff0c;怎么基于Gitee和Electron来开发一个便捷的图床工…

Docker本地部署Firefox火狐浏览器并远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…

上市公司数字化转型及同群效应数据集合(四种测算方法)

数据简介&#xff1a;当今世界处于高速发展的信息时代中&#xff0c;数字革命的产生催生出大量数字技术和数字信息。在数字经济时代&#xff0c;数字化转型赋予了企业新的发展动能&#xff0c;数字化转型已经成为诸多企业高质量发展的重要路径。是否需要进行数字化转型、能否及…

windows启动后直接进入指定程序并且不显示欢迎界面和windows桌面

windows启动后直接进入指定程序并且不显示欢迎界面和windows桌面 前言开机进入指定程序方法问题 浅尝GINA和Credential Providers关闭欢迎屏幕 前言 由于系统需求需要做到电脑开机后显示完windows加载页面就直接进入自己系统的界面&#xff0c;并且不显示登录欢迎页面&#xf…

IDE1007:当前上下文中不存在名称“xxx“

这种在Halcon中直接导出的代码不能直接放程序中&#xff0c;应该在控件中比如一个按钮中&#xff0c;就不会出错了。

Docker安装可视化工具Portainer

目录 Portainer简介 Portainer安装 Portainer简介 Portainer是一款开源的容器管理平台&#xff0c;支持多种容器技术&#xff0c;如Docker、Kubernetes和Swarm等。它提供了一个易于使用的Web UI界面&#xff0c;可用于管理和监控容器和集群。Portainer旨在使容器管理更加简单…

【celery踩坑】celery定时和周期任务全部不执行

一、背景 有一天&#xff0c;突然发现线上系统上的任务没有执行&#xff0c;状态一直是未完成。 看了一下celery的beat日志&#xff0c;发现周期任务和定时任务都不执行了。 重启项目&#xff0c;发现django_celery_beat_periodictask中&#xff0c;也只是执行前面几个周期或者…

C语言之“可变参数<stdarg.h>”

目录 前言 stdarg.h头文件 实例&#xff1a;遍历并求和所有传递给sum函数的额外实际参数 前言 有时我们会希望函数带有可变数量的参数就像printf&#xff08;cosnt char* format ...&#xff09;和scanf&#xff08;cosnt char* format ...&#xff09;那样除了有一个参数 …

【用unity实现100个游戏之17】从零开始制作一个类幸存者肉鸽(Roguelike)游戏6(附项目源码)

文章目录 本节最终效果前言开始游戏主角扣血和死亡游戏结束清屏效果赢得比赛角色选择界面每个角色有自己的特点&#xff0c;及初始属性不一样参考源码完结 本节最终效果 前言 本节紧跟着上一篇&#xff0c;主要实现不同游戏界面和不同角色选择。 开始游戏 简单绘制UI 修改…

Vue中的组件和插件

一、组件 组件是Vue中最核心的概念之一&#xff0c;它可以把一个页面拆分成多个独立的、可复用的部分。组件通常包含了自己的模板、样式和逻辑&#xff0c;用于封装一个特定的功能或界面。Vue的组件有单文件组件和普通组件两种类型&#xff0c;可以通过Vue.component或Vue.ext…

基于javaweb的宠物服务商城系统设计与开发

摘 要 最近几年以来&#xff0c;宠物在人们的日常生活中所占的地位越来越重要了&#xff0c;它们不仅仅是我们的朋友&#xff0c;也成为了我们家庭中的一份子。21世纪&#xff0c;信息技术飞速发展&#xff0c;计算机行业日新月异&#xff0c;极大地带动了信息的流动&#xff…

DS1302时钟保持芯片,让你很快读懂它

概述&#xff1a; DS1302是DALLAS公司制作的涓流充电时钟芯片。芯片有实时时钟日历功能&#xff0c;有31*8bits静态RAM&#xff0c;可以通过串行接口方式和处理器(stm32&#xff0c;ARM等)进行通信来读写RAM&#xff0c;有两种传送方式&#xff0c;单字节传送和多字节传送。内部…

OSG编程指南<十六>:OSG渲染到纹理RTT及三维纹理体渲染技术简介

1、渲染到纹理&#xff08;RTT&#xff09; 1.1 RTT介绍 RTT&#xff08;Render to Texture&#xff09;即渲染到纹理。在普通的图形渲染流程中&#xff0c;最终结果是渲染到帧缓存中&#xff0c;然后才会显示到屏幕上。而RTT则是将场景渲染到一张纹理上&#xff0c;并且在之后…

三.排序与分页

目录 一.排序数据二.分页 一.排序数据 1.排序规则 使用ORDER BY 子句排序 ASC&#xff08;ascend&#xff09;升序DESC&#xff08;descend&#xff09;降序 ORDER BY 子句在SELECT语句的结尾 2.单列排序 SELECT last_name, job_id, department_id, hire_date FROM e…

.net core 连接数据库,通过数据库生成Modell

1、安装EF Core Power Tools&#xff1a;打开Vs开发工具→扩展→管理扩展 2、(切记执行这步之前确保自己的代码不存在编写或者编译错误&#xff01;)安装完成后在你需要创建数据库实体的项目文件夹上面单击右键&#xff0c;找到EF Core 工具&#xff08;必须安装扩展之和才会有…