类和对象的基本概念

news2025/1/4 15:54:56

目录

c和c++中结构体的区别

类的封装

c语言中的行为和属性封装存在的问题

c++中对事物的封装——类的封装

尽量将成员变量设置为private

代码示例


c和c++中结构体的区别

c语言中struct只有变量,不能存放函数,也就是数据(属性)和行为(方法)是分离的

c++中结构体是可以存放函数的,也就是数据(属性)和行为是封装在一起的

struct _stu() //c

{

        int a;

        int b[5];

};

struct _stu()//c++

{

        int a;

        int b[5];

        void peintf_stu()

        {

                cout << a << endl;

        }

};

类的封装

c语言中的行为和属性封装存在的问题

现实世界的事物所具有的共性就是每个事物都具有自身的属性,一些自身具有的行为,所以如果我
们能把事物的属性和行为表示出来,那么就可以抽象出来这个事物。比如我们要表示人这个对象,在 c 语言中,我们可以这么表示 :
#include <iostream>
#include <string.h>

using namespace std;

struct Person{
    char name[64];
    int age;
};

struct Animal{
    char name[64];
    int age;
};

void PersonEat(struct Person* person){
    printf("%s 在吃人吃的饭!\n",person->name);
}

void AnimalEat(struct Animal* animal){
    printf("%s 在吃动物吃的饭!\n", animal->name);
}

int main(){
    struct Person Person;
    struct Animal animal;
    strcpy(Person.name, "小明");
    PersonEat(&Person);
    strcpy(animal.name, "dog");
    AnimalEat(&animal);
    return 0;
}
c 语言中,行为和属性是分开的,那么万一调用错误,将会导致问题发生。
从这个案例我们应该可以体会到,属性和行为应该放在一起,一起表示一个具有属性和行为的对象。

c++中对事物的封装——类的封装

c++将行为和属性封装在一起

类和结构体的区别在于 类对成员可以进行访问的权限控制,结构体不可以

访问属性属性对象内部对象外部
public公有可访问可访问
protected保护可访问不可访问
private私有可访问

不可访问

类中的函数 可以直接访问类中的成员

class Person{
    //人具有的行为(函数)
    public://公有的
        int mTall; //多高,可以让外人知道
    protected://保护的
        int mMoney; // 有多少钱,只能儿子孙子知道
    private://私有的
        int mAge; //年龄,不想让外人知道
    void show()
    {
        cout << mTall <<"";
        cout << mMoney <<"";//内部可访问
        cout << mAge <<"";//内部可访问
    }
};
int main(){
    Person p;
    p.mTall = 220;

    //p.mMoney 保护成员外部无法访问
    //p.mAge 私有成员外部无法访问
    p.Dese();
    return EXIT_SUCCESS;
}

保护的和私有的区别是 保护的子类可以访问 私有的子类不可访问

尽量将成员变量设置为private

成员变量设置为私有的,优点
        对变量的设置时的控制
        可以给变量设置制度权限
        可以给变量设置只写权限
        可以给变量设置可读可写权限
class AccessLevels{
public :
        //对只读属性进行只读访问
        int getReadOnly(){ return readOnly; }
        //对读写属性进行读写访问
        void setReadWrite( int val){ readWrite = val; }
        int getReadWrite(){ return readWrite; }
        //对只写属性进行只写访问
        void setWriteOnly( int val){ writeOnly = val; }
private :
        int readOnly; // 对外只读访问
        int noAccess; // 外部不可访问
        int readWrite; // 读写访问
        int writeOnly; // 只写访问
};

代码示例

#include <iostream>
#include <string.h>
using namespace std;

class Person
{
    public:
        void init(int init_age,char *init_name)
        {
            if(age >= 0 && age <= 100)
            {
                age = init_age;
            }
            if(init_name != NULL)
            {
                strcpy(name,init_name);
            }

        }
        void get_age(int get_age)
        {
            if(age >= 0 && age <= 100)
            {
                age = get_age;
            }
        }
        void get_name(char *get_name)
        {
            if(get_name != NULL)
            {
                strcpy(name,get_name);
            }


        }
        void set()
        {
            cout << age <<" "<<endl;
            cout << name <<" "<<endl;
        }
    private:
        int age;
        char name[8];
}person;

void test()
{
    person.init(50,"name");
    person.set();
    person.get_age(25);
    person.get_name("bob");
    person.set();
}
int main()
{
    test();
    return 0;
}

编译运行

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

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

相关文章

学信息系统项目管理师第4版系列06_项目管理概论

1. 项目基础 1.1. 项目是为创造独特的产品、服务或成果而进行的临时性工作 1.1.1. 独特的产品、服务或成果 1.1.2. 临时性工作 1.1.2.1. 项目有明确的起点和终点 1.1.2.2. 不一定意味着项目的持续时间短 1.1.2.3. 临时性是项目的特点&#xff0c;不是项目目标的特点 1.1…

什么是 DNS 隧道以及如何检测和防止攻击

什么是 DNS 隧道&#xff1f; DNS 隧道是一种DNS 攻击技术&#xff0c;涉及在 DNS 查询和响应中对其他协议或程序的信息进行编码。DNS 隧道通常具有可以锁定目标 DNS 服务器的数据有效负载&#xff0c;允许攻击者管理应用程序和远程服务器。 DNS 隧道往往依赖于受感染系统的…

记一起小意外事件引起的批量重命名文件名

一、事件描述 某次,因某业务系统迁移,一线人员对业务目录误操作,执行打包命令过程中导致Tomcat下的web应用程序无法使用,检查后发现项目下所有文件名都加了gz格式;询问一线,发现是对项目目录执行了:gzip -r ./tomcat导致程序文件找不到;报错如下: 二、事件处理 1、查看…

联表查询的时候外键id是字符串

联表查询的时候外键id是字符串 例&#xff1a; 第一种&#xff1a;可以使用&#xff1a;FIND_IN_SET 关键字进行查询&#xff08;推荐&#xff09; SELECTt.task_name,t.task_id,t.common_ids,t.task_description,t.task_type,t.task_state,t.task_start_time,t.task_end_tim…

算法-88.合并两个有序数组-⭐

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并后数组…

在Qt5中SQLite3的使用

一、SQLite简要介绍 什么是SQLite SQLite是一个进程内的库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库&#xff0c;这意味着与其他数据库不一样&#xff0c;您不需要在系统中配置。 就像其他数据库&#xff0c;S…

【AI】机器学习——感知机

文章目录 4.1 感知机基本概念4.2 策略4.2.1 数据集的线性可分性4.2.2 学习策略目标损失函数的构造关于距离的解释 4.3 算法4.3.1 原始形式损失函数的梯度下降法 4.3.2 PLA例题4.3.3 算法收敛性 4.4 PLA对偶形式4.4.1 原始PLA分析4.4.2 PLA对偶形式4.4.3 优点 4.1 感知机基本概念…

理财是什么?怎样学习理财?

大家好&#xff0c;我是财富智星&#xff0c;今天跟大家分享一下理财是什么&#xff1f;怎样学习理财的方法。 一、理财的基本原则 1、理财应注重投资而不是投机&#xff0c;要与时间为友。 让我们先考虑以下问题&#xff1a;什么样的回报才算是真正的高回报&#xff1f;假设有…

HTML5 进阶知识

简答题 什么是 HTML5 标签的语义化&#xff1f; HTML5 标签的语义化是指使用具有语义意义的标签来描述网页内容。例如&#xff0c;使用 <header> 标签来表示页眉&#xff0c;使用 <main> 标签来表示主要内容区&#xff0c;使用 <footer> 标签来表示页脚。 什…

Wireshark 用命令行分析数据包

1&#xff0c;那些情况需要使用命令行 Wireshark一次性提供了太多的信息。使用命令行工具可以限制打印出的信息&#xff0c;最后只显示相关数据&#xff0c;比如用单独一行来显示IP地址。命令行工具适用于过滤数据包捕获文件&#xff0c;并提供结果给另一个支持UNIX管道的工具…

Yolov5如何训练自定义的数据集,以及使用GPU训练,涵盖报错解决

本文主要讲述了Yolov5如何训练自定义的数据集&#xff0c;以及使用GPU训练&#xff0c;涵盖报错解决&#xff0c;案例是检测图片中是否有救生圈。 最后的效果图大致如下&#xff1a; 效果图1效果图2 前言 系列文章 1、详细讲述Yolov5从下载、配置及如何使用GPU运行 2、…

最新仿闲鱼链接+独立后台管理 跳转APP

2024最新仿xy链接源码 后台一键生成链接&#xff0c;后台管理教程&#xff1a;解压源码&#xff0c;修改数据库config/Congig 不会可以看源码里有教程 下载程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

JS防抖和节流在前端开发中的应用场景

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 防抖&#xff08;Debouncing&#xff09;⭐ 节流&#xff08;Throttling&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端…

C++与C编译后符号表对比(一百九十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

DBeaver 下载、安装与数据库连接(MySQL)详细教程【超详细,保姆级教程!!!】

本文介绍DBeaver 下载、安装与数据库连接&#xff08;MySQL&#xff09;的详细教程 一、DBeaver 下载 官网下载地址&#xff1a;https://dbeaver.io/download/ 二、安装 1、双击下载的安装包&#xff0c;选择中文 2、点击下一步 3、点击我接受 4、如下勾选&#xff0c;…

Java高级——类加载及执行子系统的案例与实战

类加载及执行子系统的案例与实战 概述类加载器案例TomcatOSGi 字节码案例动态代理Java逆向移植工具 实战——远程执行功能目标思路实现验证&#xff08;未完成&#xff0c;不会写JSP&#xff09; 概述 Class文件以何种格式存储、字节码指令如何执行等都是由JVM控制 字节码生成…

手写数据库连接池

数据库连接是个耗时操作.对数据库连接的高效管理影响应用程序的性能指标. 数据库连接池正是针对这个问题提出来的. 数据库连接池负责分配,管理和释放数据库连接.它允许应用程序重复使用一个现有的数据路连接,而不需要每次重新建立一个新的连接,利用数据库连接池将明显提升对数…

文本生成模型如何解码

文章目录 解码方法Greedy SearchBeam SearchsamplingTemperature Samplingtop-k samplingTop-p (nucleus) samplingContrastive search 总结相关资源 语言模型如何对于一个给定输入生成相应的输出呢&#xff1f;答案是使用解码策略(decoding strategy)。这里对现有的解码策略做…

在vx1000中对目标属性值的函数修改方法

通过在函数中编辑GFX对象属性值&#xff0c;实现Y坐标相反的操作方法 有时需要对目标属性的x 、y坐标做负方向转换&#xff0c;就需要以下方法来实现 return input.ProY*(-1); return input.C0*(-1);

验收测试的内容和流程有哪些?

验收测试 信息化项目验收确认测试内容一般包括&#xff1a;测试(复核 ),资料评审 ,质量鉴定三部分。 (一)验收评测工作主要包括 :文档分析 ,方案制定 ,现场测试 ,问题单提交 ,测试报告 ; (二)验收测试内容主要包括 :检查 "合同 " 或"验收标准 "要求的所…