C++面向对象之封装

2023-11-03

C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型。

类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。

类和对象

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

它认为万事万物都皆为对象,对象上有其属性和行为。

例如:

人可以作为对象,属性有姓名、年龄、身高......,行为有走、跑、跳......

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

封装

封装的意义:

  • 将属性(成员属性/成员变量)和行为(成员函数/成员方法)作为一个整体,表现生活中的事物
  • 将属性和行为加以权限控制

封装意义一:

          在设计类的时候,属性和行为写在一起,表现事物。

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

示例1:设计一个圆类,求圆的周长

# include<iostream>
using namespace std;
const double PI=3.14;
// 设计一个类
// 可见封装的意义,将圆的行为和属性放到一起,来表现圆
class Circle
{
    // 访问权限
    // 公共权限
public:

    // 属性-半径
    int r;
    // 行为
    // 获取圆的周长
    double caculate()
    {
        return 2*PI*r;
    }
};
int main(){
    // 实例化(通过圆的类  创建具体的圆(对象))
    Circle c1;
    // 给圆对象的属性进行赋值
    c1.r = 10;
    cout << "圆的周长为: " << c1.caculate() << end1
    system("pause");
    return 0;
}

封装意义二:

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

访问权限有三种:

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

2  protected 保护权限  成员类内可以访问 类外不可以访问  儿子可以访问父亲中的保护内容

3 private  私有权限      成员类内可以访问 类外不可以访问  儿子不可以访问父亲中的私有内容

示例:

#include<iostream>
using namespace std;
#include <string>
class Person
{
public:
// 公共权限
    string name;
protected:
// 保护权限
    string car;
private:
// 私有权限
    string passwword;
public:
    void func(){
        name = "张三";
        car = "拖拉机"
        password = 12345
    }
};
int main() {
    // 实例化对象
    Person p1;
    p1.name = "李四"   // 保护权限内容,类外无法访问
    p1.car = "红旗"    // 私有权限内容,类外无法访问
    p1.password = 123;
    system("pause");
    return 0;
}

struct和class的区别

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

区别:

  • struct默认权限为公共
  • class默认权限为私有

示例:

#include<iostream>
using namespace std;
#include <string>
class C1
{
    int a;//什么都没有写,即是默认权限私有
};
struct C2
{
    int b; // 默认权限是公共
}

int main() {
    C1 c1;
    c1.a=100;  //报错,因为是私有权限
    C2 c2;
    c2.b=100;  // 运行成功,因为权限是公共
    system("pause");
    return 0;
}

成员属性设置为私有

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

优点2:对于写权限,我们可以检测数据的有效性

#include<iostream>
using namespace std;
#include <string>
class Person
{
public:
    // 姓名可写
    void setname(string n)
    {
        name = n;
    }
    // 姓名可读
    voide getname()
    {
        return name;
    }
    // 年龄可读
    int getage()
    {
        age = 0// 初始化
        return age;
    }
    // 爱人只写
    void setlover(string love)
    {
        lover = love;
    }
private:
    string name;  // 设置为可读可写
    int age;      // 设置为只读
    string lover; // 设置为只写
};
int main() {
    Person p1;
    p1.setname = "张三";
    cout <<"姓名为:" <<p1.getname() << endl;
    p1.age = 18; // 不能写,报错
    cout << "年龄为:" <<p1.getage() <<endl;
    p1.setlover("licy");
    system("pause")
    return 0;
}

练习案例:设计立方体类

                  求出立方体的面积和体积

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

#include<iostream>
using namespace std;
#include <string>
class Cube
{
private:   // 属性一般设置为私有,然后提供公有的方法接口
    int longth;
    int width;
    int height;
public:  // 因为属性是私有,所以需要设置和获取长宽高
    void setl(int l)
    {
        longth = l;
    }
    int getl()
    {
        return longth;
    }
    void setw(int w)
    {
        width = w;
    }
    int getw()
    {
        return width;
    }
    void seth(int h)
    {
        height = h;
    }
    intn geth()
    {
        return height;
    }
    int calcarea()
    {
        return 2*longth*width+2*longth*height+2*width*height;

    }
    int calcvoulumn()
    {
        return longth*width*height;

    }
    // 利用成员函数判断两个立方体是否相等
    // 此时只需要一个参数,利用已知的对象调用成员函数,然后与传进来的参数进行比较
    // 因为是在类内,可以访问私有属性
    bool isSamebyClass(Cube &c)
    {
        if (height==c.geth() && longth==c.getl() && width==c.getw())
        {
             return true;
        }
    }
};
// 利用全局函数判断两个立方体是否相等(Bool函数)
// Cube c1, Cube c2 这种传入方式是值传入,是拷贝的数据
bool isSame(Cube &c1, Cube &c2)  // 传入数据--引用方式(直接是原始数据)
{
    if (c1.geth()==c2.geth() && c1.getl()==c2.getl() && c1.getw()==c2.getw())
    {
        return true;
    }
}   
int main() {
    Cube c1;
    c1.setl(10);
    c1.setw(10);
    c1.seth(10);
    cout << "c1的面积是:" << c1.calcarea() << endl;
    cout << "c1的体积是:" <<  c1.calcvoulumn() << endl;
    Cube c2;
    c2.setl(10);
    c2.setw(10);
    c2.seth(10);
    bool ret = isSame(c1,c2);
    if (ret)
    {
        cout << "c1和c2是相等的"  << endl
    }
    else{
        cout << "c1和c2是不等的"  << endl
    }
    // 利用成员函数判断
    bool ret =c1.isSamebyClass(c2);
    if (ret)
    {
        cout << "成员函数c1和c2是相等的"  << endl
    }
    else{
        cout << "成员函数c1和c2是不等的"  << endl
    }
    system("pause")
    return 0;
}

练习案例-点与圆的关系

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

//核心:在类中可以让另一个类作为本类的成员

//点类
class Point
{
public:
	void set_x(int x)//设置点x
	{
		m_x = x;
	}

	void set_y(int y)//设置点y
	{
		m_y = y;
	}


	int get_x()//获取点x
	{
		return m_x;
	}

	int get_y()//获取点y
	{
		return m_y;
	}

private:
	int m_x;//点x
	int m_y;//点y
};


//圆类
class circle
{
public:

	void set_R(int r)  //设置半径
	{
		m_R = r;
	}

	void set_P(Point p) //设置圆心
	{
		m_p = p;
	}


	int get_R()  //获取半径
	{
		return m_R;
	}


	Point get_P() //获取圆心
	{
		return m_p;
	}

private:

	int m_R;
	Point m_p;   // // 利用点类定义圆心

};

//判断点和圆的关系,点到圆心的距离和半径作比较
void  relationship(Point p, circle C)
{
	//点到圆心的距离的平方: (x-x0)平方 + (y-y0)平方
	int p_distance = ((p.get_x() - C.get_P().get_x()) * (p.get_x() - C.get_P().get_x()) +
					(p.get_y() - C.get_P().get_y()) * (p.get_y() - C.get_P().get_y()));

    //半径的平方
	int r_distance = (C.get_R() * C.get_R());

	if (p_distance > r_distance)
	{
		cout << "点在圆外" << endl;
	}
	if (p_distance < r_distance)
	{
		cout << "点在圆内" << endl;
	}
	if (p_distance == r_distance)
	{
		cout << "点在圆上" << endl;
	}

}


void main() 
{
	Point C_p;//圆心
	C_p.set_x(0);
	C_p.set_y(0);

	circle c;//圆
	c.set_R(10);
	c.set_P(C_p);

	Point P;//设置一个点
	P.set_x(0);
	P.set_y(10);
 
	relationship(P, c);//判断点和圆的关系
}

在大型的开发中,把所有的类都写在一个文件中,太大了,所以要做拆分

头文件中写声明,源文件中写实现
具体目录结构如下:

拆分成多个文件,类的声明在头文件中,类实现在源文件中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++面向对象之封装 的相关文章

随机推荐

  • split函数

    split函数的用法 split 拆分字符串 通过指定分隔符对字符串进行切片 并返回分割后的 字符串列表 语法 str split str num string count str str 分隔符 默认所有的空字符 包括空格 换行 制表符等
  • 【git系列】研发到后期,如何创建一个空白分支?

    研发到后期 在Git中新建一个分支 都是要基于某个已有的分支作为父节点 这时候如果要新建一个分支 在网页上无法实现的 网页上无法实现 而我们又很需要创建一个空百分支 怎么办呢 以下几个步骤可以实现 1 使用命令 git checkout o
  • ABAP ALV合计或者小计 添加自定义文本

    自己测试内容 仅供参考
  • 基础算法题——树状数组 1 :单点修改,区间查询

    树状数组 复习基础 include
  • @Scheduled定时任务管理界面

    1 产生的背景 因这家公司多个项目里面都是基于 Scheduled来做定时任务 零零散散有十几个任务在跑 这些任务没有一个统一的界面去管理起来 比如 暂停 删除或者手动执行一次等 基于这些产生了schedule starter组件的开发 2
  • 关闭多个activity

    关闭多个activity Android程序有很多Activity 比如说主窗口A 调用了子窗口B 在B中如何关闭整个Android应用程序呢 首先要说明在B中直接使用finish 接下来手机显示的还是主窗口A 所以一起来看看Android
  • Python3标准库漫游之Typing.overload

    Python3标准库漫游之Typing overload Python3 gt 3 5 Python3 5开始Python把Typing作为标准库引入 低版本可以使用独立的Typing包 问题来源于一个QQ群友的提问 顺着问题我看了下Typ
  • Tex: The top-level auxiliary file: *.aux I couldn't open style file IEEEtran.bst 解决方法

    参考 Bibliography is not printed using Kile on Ubuntu Tex The top level auxiliary file aux I couldn t open style file IEEE
  • 分享一个基于微信小程序的汽车租赁小程序 车辆出租小程序 汽车租借小程序源码 lw 调试

    作者 计算机源码社 个人简介 本人七年开发经验 擅长Java Python PHP NET 微信小程序 爬虫 大数据等 大家有这一块的问题可以一起交流 学习资料 程序开发 技术解答 文档报告 如需要源码 可以扫取文章下方二维码联系咨询 Ja
  • 解决swiper在标签页里面 先隐藏后显示 之后 的一系列问题

    方法一 当页面很简单的时候 比如 页面时只有一个标签页 那么我们直接用最简单的方法 直接看官网就可以啦API就可以啦 里面提供了API gt http www swiper com cn api observer 218 html 如下就是
  • 福禄克DSX2-5000、DSX2-8000威测2系列功能简介

    福禄克DSX2 5000 DSX2 8000威测2系列功能简介 福禄克新一代铜缆测试仪DSX2 5000 DSX2 8000 属于Versiv系列手持式测试平台 采用模块化设计 DSX2 5000 Level V五级精度 1200MHz 线
  • #pragma comment (lib, "ws2_32.lib") 调用报错

    pragma comment lib ws2 32 lib 调用报错 最近用c实现tcp链接时参考别人的代码中发现如下代码 pragma comment lib ws2 32 lib ide用的dev 无法编译通过 查找相关资料了解到 pr
  • IDE Eval Reset 插件安装使用

    IDE Eval Reset 插件 Jetbrains家的产品有一个很良心的地方 他会允许你试用30天 这个数字写死在代码里了 以评估是否你真的需要为它而付费 事实上有一款插件可以实现这个功能 你或许可以用它来重置一下试用时间 但切记不要无
  • 云服务器 文件管理,云服务器文件管理工具

    云服务器文件管理工具 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 为安全起见 用户登录弹性云服务器时建议使用密钥对方式
  • vue3 setup语法糖 简单使用

    文档 Vue3 组合式 API 文档 介绍 Vue js vuejs org Vue3 单文件组件
  • MyBatis中foreach使用

    目录 1 foreach中的属性说明 2 collection属性的详细说明 3 示例 1 传入的是单参数且参数类型是一个List 2 传入的是单参数且参数类型是一个array数组 3 传入的参数是实体类 并且实体中包含数组和集合 4 传入
  • 实用工具篇(三):Free Mybatis plugin

    实用工具篇 三 Free Mybatis plugin 实用工具篇 一 Postman 实用工具篇 二 SourceTree Free Mybatis plugin 老规矩先吹一波 这个idea里面的插件真的十分nice 上个图让你们知道他
  • Scrum敏捷开发:适应变化的核心能力

    在当今高度变化的时代 软件开发的环境和要求也在不断变化 传统的开发方法往往难以适应这种快速变化 因此 一种新的软件开发方法 敏捷开发逐渐得到了广泛的关注和应用 本文将介绍敏捷开发的概念 优势 实践经验 敏捷开发工具以及注意事项 帮助您更好地
  • 解决vue-router跳转不起作用

    router 这么写 export default new Router mode history routes path homePage name HomePage component HomePage path topUpPage n
  • C++面向对象之封装

    C 在 C 语言的基础上增加了面向对象编程 C 支持面向对象程序设计 类是 C 的核心特性 通常被称为用户定义的类型 类用于指定对象的形式 它包含了数据表示法和用于处理数据的方法 类中的数据和方法称为类的成员 函数在一个类中被称为类的成员