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

news2025/1/12 3:58:09

目录

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:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

党建引领·和谐共建——赤岗街首届微型社区养老服务公益博览会开幕

服务咨询平台&#xff0c;让社区长者更便捷地了解到养老相关政策、信息。 本次活动由赤岗街公共卫生委员会、赤岗街道办事处、中国老龄事业发展基金会老年维权基金管理委员会主办&#xff0c;珠影社区居委会、广州市穗星社会工作服务中心、广州市盈泽信息科技有限公司承办&…

生成对抗网络(DCGAN)手写数字生成

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09; 二、什么是生成对抗网络1. 简单介绍2. 应用领域 三、创建模型1. 生成器2. 判别器 四、定义损失函数和优化器1. 判别器损失2. 生成器损失 五、定义训练循环六、训练模型七、创建 G…

Amazon CodeWhisperer 使用体验

文章作者&#xff1a;STRIVE Amazon CodeWhisperer 是最新的代码生成工具&#xff0c;支持多种编程语言&#xff0c;如 java,js,Python 等&#xff0c;能减少开发人员手敲代码时间&#xff0c;提升工作效率。PS:本人是一名 CodeWhisperer 业余爱好者 亚马逊云科技开发者社区为开…

Spring Cloud 配置 Nacos

一&#xff0c;下载Nacos 下载地址&#xff1a;https://github.com/alibaba/nacos/releases 二&#xff0c;启动Nacos 安装Nacos的bin目录下&#xff0c; 执行&#xff1a;startup.cmd -m standalone 然后打开上图红框的地址 三&#xff0c;配置服务 1 配置Nacos 创建命名…

【C++】异常抛出变量的生命周期

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。搜…

[Android] c++ 通过 JNI 调用 JAVA函数

如何使用&#xff1a; Calling Java from C with JNI - CodeProject c里的 JNI 类型 和 JAVA 类型的映射关系&#xff1a; JNI Types and Data Structures Primitive Types and Native Equivalents Java TypeNative TypeDescriptionbooleanjbooleanunsigned 8 bitsbytejbyt…

高级java工程师手把手教你解决内存不足引起JVM奔溃真实生产事故案例实战

高级java工程师手把手教你解决内存不足引起JVM奔溃案例实战 一、真实事故描述&#xff1a; 生产环境的Java程序进程&#xff0c;直接宕掉&#xff0c;进程都没有了&#xff0c;JVM奔溃了。生产事故&#xff0c;生产直接停止了&#xff0c;甲方爸爸客户着急了&#xff0c;公司…

使用yolov7进行多图像视频识别

1.yolov7你可以让你简单的部署,比起前几代来说特别简单 #下面是我转换老友记的测试视频,可以看到几乎可以准确预测 2.步骤 1.在github官网下载代码 https://github.com/WongKinYiu/yolov7 2.点击下载权重文件放到项目中 3.安装依赖,我的python版本是3.6的 pip install -r requ…

SQL中left join、right join、inner join等的区别

一张图可以简洁明了的理解出left join、right join、join、inner join的区别&#xff1a; 1、left join 就是“左连接”&#xff0c;表1左连接表2&#xff0c;以左为主&#xff0c;表示以表1为主&#xff0c;关联上表2的数据&#xff0c;查出来的结果显示左边的所有数据&#…

如何从初级进阶中级测试工程师?测试人该具备哪些素养?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、如何成为一枚中…

JAVA全栈开发 day14_集合(Collection\List接口、数据结构、泛型)

一、数组 数组是一个容器&#xff0c;可以存入相同类型的多个数据元素。 数组局限性&#xff1a; ​ 长度固定&#xff1a;&#xff08;添加–扩容&#xff0c; 删除-缩容&#xff09; ​ 类型是一致的 对象数组 &#xff1a; int[] arr new int[5]; … Student[] arr …

分享88个清新唯美PPT,总有一款适合您

分享88个清新唯美PPT&#xff0c;总有一款适合您 88个清新唯美PPT下载链接&#xff1a;https://pan.baidu.com/s/1XUUjxjmWFw2fJKENjk6_Yg?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整…

【亚马逊云科技】re:Invent 2023 | Amazon Q王炸产品震撼来袭

re:Invent 2023前沿资讯快速入口➡️&#xff1a;2023亚马逊云科技reinvent大会&#xff0c;与开发者一起构建未来&#xff01; 文章目录 一、2023 亚马逊云科技 re:Invent 精彩内容速递&#x1f3a8;二、Amazon Q 震撼来袭2.1 什么是Amazon Q&#xff1f;2.2 Amazon Q功能介绍…

OpenHarmony 关闭息屏方式总结

前言 OpenHarmony源码版本&#xff1a;4.0release 开发板&#xff1a;DAYU / rk3568 一、通过修改系统源码实现不息屏 修改目录&#xff1a;base/powermgr/power_manager/services/native/profile/power_mode_config.xml 通过文件中的提示可以知道DisplayOffTime表示息屏的…

wordpress安装之Linux ftp传输

工欲善其事,必先利其器。 最近准备在自己的服务器上搭建一个个人技术分享的平台。 因为我发现现在网络上的工具呀&#xff0c;还有一些问题的解答总是模棱两可&#xff0c;所以我打算自己做一个。 首先呢&#xff0c;我们需要有一个linxu的系统当服务器&#xff0c;然后呢&a…

d3dcompiler_47.dll缺失怎么修复?一招搞定电脑弹窗问题

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“d3dcompiler_47.dll缺失”。这个错误通常出现在游戏或应用程序运行时&#xff0c;它会导致程序无法正常启动或运行。为了解决这个问题&#xff0c;我们需要采取一些措施来修复缺失的文件。…

带米勒钳位的隔离驱动SiLM5350系列 工作原理、特性参数、封装形式

带米勒钳位的隔离驱动SiLM5350系列 单通道 30V&#xff0c;10A 带米勒钳位的隔离驱动 具有驱动电流更大、传输延时更低、抗干扰能力更强、封装体积更小等优势, 为提高电源转换效率、安全性和可靠性提供理想之选。 描述&#xff1a; SiLM5350系列是单通道隔离驱动器&#xff0…

2023年中国数据要素市场研究报告

第一章 概况 1.1 定义 中国数据要素交易市场是一个多层次、多维度的复杂体系&#xff0c;涵盖了不同的交易方式、市场类型和行业应用。数据要素作为一种新兴的生产要素&#xff0c;涉及社会经营活动中所有可以电子化记录、为使用者或所有者带来经济效益的数据资源。 在狭义上…

图片点击放大

在列表中添加插槽 <template slot-scope"scope">&#xff0c;获取当前点击的数据 在图片中添加点击事件的方法&#xff0c;用来弹出窗口 <vxe-columnfield"icon"title"等级图标"><template slot-scope"scope"><…

基于若依的ruoyi-nbcio流程管理系统仿钉钉流程初步完成转bpmn设计(还有bug,以后再修改)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 今天初步完成仿钉钉流程转bpmn设计的工作&#xff0c;当然还有不少bug&#xff0c;以后有需要或者网友也帮…