C++核心编程之类和对象---C++面向对象的三大特性--封装

news2025/2/28 2:50:25

目录

类和对象

类和对象的概念

C++面向对象的三大特性

一、封装

封装案例1:设计一个学生类,可以给姓名和学号赋值,可以显示学生的姓名和学号。

二、访问权限

访问权限有三种

struct和class的区别

三、成员属性私有化

成员属性私有化的优点:

四、封装案例

案例1:设计立方体类

案例2:点和圆的关系


类和对象

面向对象编程(OOP)是现代编程的基石之一。C++是一种支持OOP的语言,允许你创建类(Class)和对象(Object)。

类和对象的概念

  1. 类是对对象的抽象。类是一种抽象的数据类型。它们的关系是,对象是类的实例,类是对象的模板。对象是通过new className产生的,用来调用类的方法;类的构造方法 。

  2. 类的意义:

    2-1.类是把属性和方法进行封装,同时对类的属性和方法进行访问控制。

    2-2.类是由我们根据客观事物抽象而成,形成一类事物,然后用类去定义对象,形成这类事物的具体个体。

    2-3.类是一个数据类型,类是抽象的,而对象是一个具体的变量,是占用内存空间的。

  3. 类的访问控制

    在C++中可以对类的属性和方法定义访问级别,public修饰的属性和方法,可以在类的内部访问,也可以在类的外部进行访问。private修饰的属性和方法,只能在类的内部进行访问。

  4. 行为

    所有对象公有操作即成员函数(通常习惯为public属性)属性:所有对象公有特性即数据成员(通常习惯为protected属性)

C++面向对象的三大特性

C++面向对象的三大特性为:封装,继承,多态。

封装目的是实现代码模块化,继承目的是实现代码扩展,静态多态的目的是函数重载和泛型编程,动态多态的目的是虚函数重写。

C++认为万事皆为对象,对象上有其属性和行为

例如:

人可以作为对象,属性有姓名、年龄、身高、体重...,行为有走、跑、跳、吃饭、唱歌…

车也可以作为对象,属性有轮胎、方向盘、车灯...行为有载人、放音乐、放空调...

具有相同性质的对象,我们 可以抽象称为类,人属于人类,车属于车类

一、封装

封装是C++面向对象的三大特性之一,封装就是将数据和行为有机结合起来,形成一个整体。把数据和处理数据的操作结合形成类,数据和函数都是类的成员。

1.封装的意义:

  • 将属性和行为作为一个整体,表现生活中的事务
  • 将属性和行为加以权限控制

2.语法:

class   类名{访问权限:属性/行为}

示例:通过一个圆类中的行为得到圆的周长

#include<iostream>

#include<string>

using namespace std;

// 圆周率

const double PI = 3.14;

// 设计一个圆类   求圆的周长

// class(一个类) 类名

// class代表设计一个类,类后面紧跟着的就是类的名称

class circle {

    // 访问权限

    // 公共权限

public:

    // 属性

    // 半径

    int r;

    //行为:一般为函数

    // 获取周长

    double calculateZC()

    {

        return 2 * PI * r;

    }

};



int main()

{

    // 通过圆类创建具体的圆(对象)

    // 实例化   ( 通过一个类  创建一个对象的过程 )

    circle c1;

    // 给圆对象 的属性进行赋值

    c1.r = 10;
    
    cout << "圆的周长:" << c1.calculateZC() << endl;

    return 0;

}

运行结果:

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

封装案例1:设计一个学生类,可以给姓名和学号赋值,可以显示学生的姓名和学号。

#include<iostream>

#include<string>

using namespace std;

// 设计一个学生类,属性有姓名和学号

// 可以给姓名和学号赋值,可以显示学生的姓名和学号

// 设计学生类

class student {

public:  // 公共权限



    // 类中的属性和行为  我们统一称为  成员

    // 属性  成员属性   成员变量

    // 行为  成员函数   成员方法



    // 属性

    string name;

    int id;



    // 行为

    // 显示姓名与学号

    void showstu()

    {

        cout << "姓名: " << name << "  学号: " << id << endl;

    }



    // 可以通过对象的行为给属性赋值

    void setname(string i_name)

    {

        name = i_name;

    }

    void setID(int i_id)

    {

        id=i_id;

    }

};

int main()

{

    // 创建一个具体的学生

    // 实例化对象

    class student s1;

    // 给s1属性赋值

    s1.setname("张三");

    s1.id = 01;

    s1.showstu();



    class student s2;

    // 给s2属性赋值

    s2.name = "李四";

    s2.id = 02;

    s2.showstu();



    class student s3;

    // 通过对象的行为给属性赋值

    s3.setname("王五");

    s3.setID(03);

    s3.showstu();

    return 0;

}

 

运行结果:

 

二、访问权限

类在设计时,可以把属性和行为放在不同的权限下,加以控制。

访问权限有三种

 1. public          公共权限                成员 类内类外都可以访问

 2. protected   保护权限                成员 类内可以访问,类外不可以访问(有继承关系,父子关系)

 3. private            私有权限                成员 类内可以访问,类外不可以访问(父子关系也不可以访问)

示例:

#include<iostream>

using namespace std;

class person{

public:

    // 公共权限

    string name;



protected:

    // 保护权限

    string car;



private:

    // 私有权限

    int password;



public:

    void fun()

    {

        name = "张三";

        car = "BMW";

        password = 123456;

    }

    // 不管哪种形式在类内都是可以访问的

};

int main ()

{

    // 实例化具体的对象

    class person p1;

    p1.name = "李四";



    p1.car = "AMG";  // 保护权限的内容在类外是不能访问的



    p1.password = 258258; // 私有权限的内容在类外是不能访问的

    return 0;

}

 

报错显示:

 

struct和class的区别

在c++中struct和class唯一的区别就在于默认的访问权限不同

区别:

 struct 默认是公共权限

 class 默认是私有权限

 

示例:

#include<iostream>

using namespace std;

class C1
{

    int m_A;// 默认权限   是私有

};

struct C2
{

    int m_A;// 默认权限  是公共

};

int main ()

{

    class C1 c1;

    c1.m_A=1000;

    struct C2 c2;

    c2.m_A=100;

    return 0;

}

 

报错显示:

 

三、成员属性私有化

成员属性私有化的优点:

 1. 将所有成员属性设置为私有,可以自己控制读写权限

 2. 对于写权限,可以检测数据的有效性

示例:

#include<iostream>

#include<string>

using namespace std;

// 设计一个人类

class person{

    // 设计一个public 的公共接口

public:

    // 设置姓名

    void set_name(string in_name)

    {

            name = in_name;

    }

    // 获取姓名

    string get_name()

    {

        return name;

    }

    // 设置年龄

    void set_age(int in_age)

    {

        if(in_age<=0||in_age>150){

            cout<<"你输入的年龄有误!"<<endl;

            return;

        }

        age=in_age;

    }

    // 获取年龄

    int get_age()

    {

        return age;

    }

    // 设置情人,只写

    void set_lover(string in_lover)

    {

        lover = in_lover;

}

private:

    // 姓名  可读可写

    string name;



    // 年龄        可读可写

    int age = 0;



    // 情人        只写

    string lover;

};

int main()

{

    class person p1;

    p1.set_name("张三");

    cout<<"姓名为: "<<p1.person::get_name()<<endl;

    p1.set_age(200);

    cout<<"年龄为: "<<p1.person::get_age()<<endl;

    p1.set_lover("鞠婧祎");

    return 0;

}

运行结果:

四、封装案例

案例1:设计立方体类

设计立方体类(Cube)

求出立方体的面积和体积

分别用全局函数和成员函数判断两个立方体是否相等。

示例:

#include<iostream>

#include<string>

using namespace std;

/*

1.创建立方体类

2.设计属性

3.设计行为  获取立方体面积和体积

4.分别利用全局函数和成员函数  判断两个立方体是否相等

*/

// 立方体类

class Cube{

public:

    void setL(int L)

    {

        m_L=L;

    }

    int getL()

    {

        return m_L;

    }

    void setW(int W)

    {

        m_W=W;

    }

    int getW()

    {

        return m_W;

    }



    void setH(int H)

    {

        m_H=H;

    }

    int getH()

    {

        return m_H;

    }



    // 获取立方体的面积

    int calculateS()

    {

        return 2*(m_L*m_W+m_W*m_H+m_L*m_H);

    }

    // 获取立方体的体积

    int calculateV()

    {

        return m_L*m_H*m_W;

    }

   

    // 利用成员函数判断两个立方体是否相等

    bool isSameByClass(Cube &C)

    {

        if(m_L==C.getL()&&m_W==C.getW()&&m_H==C.getH()){

            return true;

        }

        return false;

    }

private:

    int m_L;// 长

    int m_W;// 宽

    int m_H;// 高

};

// 利用全局函数判断  两个立方体是否相等

bool isSame(Cube &C1,Cube &C2)

{

    if(C1.getL()==C2.getL()&&C1.getW()==C2.getW()&&C1.getH()==C2.getH()){

        return true;

    }

    return false;

}

int main()

{

    // 创建一个立方体对象

    class Cube C1;

    C1.setL(10);

    C1.setW(10);

    C1.setH(10);

    cout<<"C1的面积为:"<<C1.calculateS()<<endl;

    cout<<"C1的体积为:"<<C1.calculateV()<<endl;



    // 创建第二个立方体

    class Cube C2;

    C2.setL(10);

    C2.setW(20);

    C2.setH(10);



    // 全局函数判断

    bool ret=isSame(C1,C2);

    if(ret){

        cout<<"C1和C2是相等的"<<endl;

    }

    else{

        cout<<"C1和C2是不相等的"<<endl;

    }



    // 成员函数判断

    ret=C1.isSameByClass(C2);

    if(ret){

        cout<<"成员函数判断:C1和C2是相等的"<<endl;

    }

    else{

        cout<<"成员函数判断:C1和C2是不相等的"<<endl;

    }

    return 0;

}

运行结果:

案例2:点和圆的关系

设计一个圆形类(Circle),和一个点类(Point),计算点和圆的关系。

示例:

#include<iostream>

#include<string>

#include<cmath>

using namespace std;

// 判断点和圆的关系

/*

点到圆心的距离== 半径  点在圆上

点到圆心的距离 > 半径  点在圆外

点到圆心的距离 < 半径  点在圆内

*/

class Point

{

public:

    void setX(int X)

    {

        m_X=X;

    }

    int getX()

    {

        return m_X;

    }

    void setY(int Y)

    {

        m_Y=Y;

    }

    int getY()

    {

        return m_Y;

    }

private:

    int m_X;

    int m_Y;

};

class Circle

{

public:

    // 设置半径

    void setR(int R)

    {

        m_R=R;

    }

    int getR()

    {

        return m_R;

    }

    // 设置圆心

    void setCenter(Point center)

    {

        m_Center=center;

    }

    Point getCenter()

    {

        return m_Center;

    }

private:

    int m_R;  // 半径

    class Point m_Center;

};

// 判断点和圆的关系

void isInCircle(Circle &c,Point &p)

{

    // 计算两点间距离

    int distance=pow((pow(c.getCenter().getX()-p.getX(),2))+(pow(c.getCenter().getY()-        p.getY(),2)),0.5);



    if(distance==c.getR()){

        cout<<"点在圆上"<<endl;

    }else if(distance > c.getR()){

        cout<<"点在圆外"<<endl;

    }else{

        cout<<"点在圆内"<<endl;

    }

}

int main()

{

    // 创建一个圆  和一个圆心  的对象

    Circle c;

    c.setR(10);

    Point center;

    center.setX(10);

    center.setY(0);

    c.setCenter(center);



    // 创建一个点

    Point P;

    P.setX(10);

    P.setY(9);



    // 全局函数判断点和圆的位置关系

    isInCircle(c,P);

    return 0;

}

运行结果:

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

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

相关文章

第十三章总结

一.泛型 1.定义泛型类 泛型机制语法&#xff1a; 类名<T> 其中&#xff0c;T是泛型的名称&#xff0c;代表某一种类型。 【例13.6】创建带泛型的图书类 代码&#xff1a; 结果&#xff1a; 2.泛型的常规用法 (1)定义泛型类时声明多个变量 class MyCla…

【MySQL集群一】CentOS 7上搭建MySQL集群:一主一从、多主多从

CentOS 7上搭建MySQL集群 介绍一主一从步骤1&#xff1a;准备工作步骤2&#xff1a;安装MySQL步骤3&#xff1a;配置主服务器步骤4&#xff1a;创建复制用户步骤5&#xff1a;备份主服务器数据&#xff0c;如果没有数据则省略这一步步骤6&#xff1a;配置从服务器步骤7&#xf…

Javase | 集合-上

目录&#xff1a; 一、集合&#xff1a;1.集合的概述2.集合的分类 二、“单个方式”存储元素&#xff1a;1.Collection1.1 Collection的概述1.2 Collection接口中常用的方法Iterator<T> iterator( ) 1.3 Collection下的子接口 2.Iterable&#xff1a;2.1 Iterable的概述2…

国内AI语言大模型【星火】各类模块及部分功能使用方法介绍

一、前言 现在AI语言大模型是百花齐放,挺好!有竞争,有发展,才能推出更好的产品。现在,科大讯飞就推出了大语言模型——星火!能够学习和理解人类的语言,进行多轮对话,回答问题,高效便捷地帮助人们获取信息、知识和灵感。星火在对话栏设置了三个插件:文档回答、PPT生成…

Java中transient关键字的详细总结

Java中transient关键字的详细总结 概要介绍 本文要介绍的是Java中的transient关键字&#xff0c;transient是短暂的意思。对于transient 修饰的成员变量&#xff0c;在类的实例对象的序列化处理过程中会被忽略。 因此&#xff0c;transient变量不会贯穿对象的序列化和反序列化…

C2基础设施威胁情报对抗策略

威胁情报是指在信息安全和安全防御领域&#xff0c;收集、分析和解释与潜在威胁相关的信息&#xff0c;以便预先发现并评估可能对组织资产造成损害的潜在威胁&#xff0c;是一种多维度、综合性的方法&#xff0c;其通过信息的收集、分析和研判&#xff0c;帮助组织了解可能对其…

Linux学习第11天:字符设备驱动开发:一字一符总见情

本文是驱动开发的第一篇笔记。主要内容是字符设备驱动开发最基础的内容&#xff0c;主要包括字符设备的概念、开发步骤以及一个十分重要的概念&#xff1a;设备号。其思维导图能简单的显示本文的基本框架&#xff0c;如下&#xff1a; 一、字符设备 字符设备就是一个一个字节&a…

MySQL注入绕安全狗脚本 -- MySQLByPassForSafeDog,以及端口爆破工具 -- PortBrute配置使用

工具介绍 此Tamper仅仅适用于MySQL数据库&#xff0c;在SQLMap使用过程中添加参数–tamperMySQLByPassForSafeDog。 安装与使用 1、安装网站安全狗Apache最新版 2、启用安全狗&#xff0c;不加MySQLByPassForSafeDog绕狗Tamper: python sqlmap.py -u "http://192.168.…

又一个Python调试利器

迷途小书童 读完需要 5分钟 速读仅需 2 分钟 1 简介 在编程过程中&#xff0c;几乎难以避免的会出现错误。事实上&#xff0c;程序员为了消除错误&#xff0c;要花费大量的时间在代码调试上。在调试过程中&#xff0c;使用 print() 语句来理解程序流程和发现意外行为无疑是最常…

iOS系统暗黑模式

系统暗黑模式&#xff1a; 暗黑模式颜色适配&#xff1a; 方式1&#xff1a; Assets配置&#xff1a;在Assets中配置好颜色后&#xff0c;可以通过colorNamed: 放大获取到动态颜色。 方式2&#xff1a;代码配置&#xff0c;通过代码colorWithDynamicProvider: 可以看出来生成…

C语言指针进阶(2)

大家好&#xff0c;我们今天继续来分享指针进阶的内容。 目录 5.函数指针 6.函数指针数组 7. 指向函数指针数组的指针 8. 回调函数 5.函数指针 顾名思义函数指针里面存的就是函数的地址了。 那我们通过一段代码来理解函数指针&#xff1a; #include<stdio.h> int Add…

向日葵无法连接服务器(无法登录)

最近在使用向日葵过程中&#xff0c;突然就不能登录向日葵了&#xff0c;网上查了各种解决方案&#xff0c;比如说防火墙是不是把向日葵给拦截了&#xff1f;更换不同的版本等等&#xff0c;都无法解决&#xff0c;最后突然想到是不是电脑对向日葵原安装目录限制了&#xff1f;…

创建表

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 创建表 语法格式: create table 表名(列名1 数据类型,列名2 数据类型,... ,列名n, 数据类型 ); 练习:在czwbkl库中,创建一格test01表 跟大家说…

windows下C++的反射功能

概述 c/c如果在日志中查看某个结构体/类的每个变量名&#xff0c;变量值信息&#xff0c;只能通过printf逐个格式化&#xff0c;非常繁琐&#xff0c;如何做到类似protobuff转json的序列化功能呢&#xff1f;该dll库先通过分析pdb文件获取结构体/类的变量名称、变量地址&#…

WebGL 从0到1绘制一个立方体

目录 前言 组成立方体的面、三角形、顶点坐标和顶点颜色 通过顶点索引绘制物体 gl.drawElements(mode, count, type, offset) 函数规范 示例程序 彩色立方体&#xff08;HelloCube.js&#xff09; 代码详解 向缓冲区中写入顶点的坐标、颜色与索引 gl.ELEMENT_ARRAY_B…

RFID产线自动化升级改造管理方案

应用背景 在现代制造业中&#xff0c;产线管理是实现高效生产和优质产品的关键环节&#xff0c;产线管理涉及到生产过程的监控、物料管理、工艺控制、质量追溯等多个方面&#xff0c;有效的产线管理可以提高生产效率、降低成本、改善产品质量&#xff0c;并满足市场需求的变化…

elasticsearch1

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;三人行&#xff0c;必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》&#xff0c;SpringCloud…

iText实战--在现有PDF上工作

6.1 使用PdfReader读取PDF 检索文档和页面信息 D:/data/iText/inAction/chapter03/image_direct.pdf Number of pages: 1 Size of page 1: [0.0,0.0,283.0,416.0] Rotation of page 1: 0 Page size with rotation of page 1: Rectangle: 283.0x416.0 (rot: 0 degrees) Is reb…

重新认识架构—不只是软件设计

前言 什么是架构&#xff1f; 通常情况下&#xff0c;人们对架构的认知仅限于在软件工程中的定义&#xff1a;架构主要指软件系统的结构设计&#xff0c;比如常见的SOLID准则、DDD架构。一个良好的软件架构可以帮助团队更有效地进行软件开发&#xff0c;降低维护成本&#xff0…

C# 查找迷宫路径

1.导入图像&#xff0c;并且将图像转灰度 using var img new Image<Bgr, byte>(_path); using var grayImg img.Convert<Gray, byte>(); 2.自动二值化图像 using var inputGrayOut new Image<Gray, byte>(grayImg.Size); // 计算OTSU阈值 var threshol…