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

2023-09-16 12:19:09

目录

类和对象

类和对象的概念

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;

}

运行结果:

更多推荐

io流笔记

字节输出流1.创建字节输出流对象FileOutputStream变量名=newFileOutputStream(name:);①参数是字符串表示的路径或者是file对象都是可以的②如果文件不存在会创造一个新的文件,但是要保证父级路径是存在的。③如果文件已经存在,则会清空文件2.写数据write(intb)一次写一个字节

想要通过软件测试的面试,都需要学习哪些知识

很多人认为,软件测试是一个简单的职位,职业生涯走向也不会太好,但是随着时间的推移,软件测试行业的变化,人们开始对软件测试行业的认知有了新的高度,越来越多的人开始关注这个行业,开始重视这个职位,那么,软件测试知识到底需要学到怎么样的成都,才能够轻松通过面试,在工作中游刃有余呢?第一、测试理论首先需要对测试岗位有一定的了解

贝叶斯分位数回归、lasso和自适应lasso贝叶斯分位数回归分析免疫球蛋白、前列腺癌数据...

原文链接:http://tecdat.cn/?p=22702贝叶斯回归分位数在最近的文献中受到广泛关注,本文实现了贝叶斯系数估计和回归分位数(RQ)中的变量选择,带有lasso和自适应lasso惩罚的贝叶斯(点击文末“阅读原文”获取完整代码数据)。摘要还包括总结结果、绘制路径图、后验直方图、自相关图和绘制分位数图的进一

数据库开发-MySQL基础DQL和多表设计

1.数据库操作-DQLDQL英文全称是DataQueryLanguage(数据查询语言),用来查询数据库表中的记录。1.1介绍查询关键字:SELECT查询操作是所有SQL语句当中最为常见,也是最为重要的操作。在一个正常的业务系统中,查询操作的使用频次是要远高于增删改操作的。当我们打开某个网站或APP所看到的展示信息,都

微信小程序案例2-2:本地生活

文章目录一、运行效果二、知识储备(一)swiper与swiper-item组件1、swiper组件(1)功能描述(2)属性说明2、swiper-item组件(1)功能描述(2)属性说明3、基本语法4、案例演示(二)text组件1、常用属性2、案例演示(三)Flex布局1、什么是Flex布局2、基本概念(1)Flex容器

【含面试】解锁MySQL group_concat的无限可能性:解决长度限制并实现高效查询

AI绘画关于SD,MJ,GPT,SDXL百科全书面试题分享点我直达2023Python面试题2023最新面试合集链接2023大厂面试题PDF面试题PDF版本java、python面试题项目实战:AI文本OCR识别最佳实践AIGamma一键生成PPT工具直达链接玩转cloudStudio在线编码神器玩转GPUAI绘画、A

Python日期处理库:掌握时间的艺术

💂个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】日期和时间在计算机编程中起着至关重要的作用,无论您是在开发应用程序、分析数据还是进行自动化任务,都需要处理日期和时间。Python作为一门

vue-h5移动Web的Flex布局

Flex布局Flexible布局,也就是弹性布局。Flexible的优点是,不需要对元素设置固定的宽度和高度,元素的位置和大小也会跟着父元素或者浏览器的状态来自动适配。同时还添加了水平居中和垂直居中的解决方案。在页面中指定一个元素作为Flex布局,那么这个元素就是作为容器冤元素。设置如下:.box{display:fl

Vuex详解:Vue.js的状态管理方案

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

从数字化到智能化再到智慧化,智慧公厕让城市基础配套更“聪明”

随着科技的迅猛发展,城市生活方式与配置设施的方方面,面也在不断的改变和升级。智慧公厕作为城市基础配套设施的一部分,从数字化到智能化再到智慧化,正逐渐展现出其独特的魅力和优势。实现了公共厕所建设、使用与管理方式的全面变革,本文将以智慧公厕领航厂家广州中期科技有限公司,大量的精品案例项目的实景实例实图,深入探讨智慧公厕的定

CSS 之 grid 网格布局

一、简介​display:grid;用于设置元素内部的布局类型为网格布局,其外显类型为块级元素。该类型的元素将内部分为行和列,划分成一个个单元格,并通过一系列相关属性控制单元格及其内容的布局和大小。​该属性值的主要应用场景为:多行多列元素排列布局。采用grid布局的元素,被称为“容器”(container),其内部的直

热文推荐