【C++】封装的详细介绍

2023-11-06

1. 封装的意义

封装是C++面向对象的三大特性之一。

封装的意义:
(1)将属性和行为作为一个整体,表现生活中的事物;
(2)将属性和行为加以权限控制(public公共权限,protected保护权限,private私有权限)

语法:

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

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

示例代码:

#include <iostream>
using namespace std;

//圆周率
const double PI = 3.14;

//设计一个圆类,求圆的周长
// 圆求周长的公式:2 * PI * R

// class 代表设计一个类,类后面紧跟着的就是类名称
// 类中的属性和行为统一称为成员
// 属性,成员属性,成员变量
// 行为,成员函数,成员方法
class Circle
{
    //访问权限,公共权限
public:

    //属性
    int m_r;     //半径

    //行为
    //获取圆的周长
    double calculateZC()
    {
        return 2 * PI * m_r;
    }
};

int main()
{
    //通过圆类,创建具体的圆(对象)
    Circle c1;      //实例化,通过一个类,创建一个对象的过程
    //给圆对象的属性进行赋值
    c1.m_r = 10;

    //计算圆的周长
    cout << "圆的周长为:" << c1.calculateZC() << endl;

    return 0;
}

示例2: 权限控制

#include <iostream>
using namespace std;

//访问权限有三种
//公共权限public,成员类内可以访问,类外可以访问
//保护权限protected,成员类内可以访问,类外不可以访问,儿子也可以访问父亲中的保护内容
//私有权限private,成员类内可以访问,类外不可以访问,儿子不可以访问父亲中的私有内容

class Person
{
public: 
    //公共权限
    string m_Name;  //姓名

protected:
    //保护权限
    string m_Car;   //汽车

private:
    //私有权限
    int m_Password;     //密码

public:
    void func()
    {
        m_Name = "张三";
        m_Car = "拖拉机";
        m_Password = 123456;
    }
};

int main()
{
    //实例化具体对象
    Person p1;

    p1.m_Name = "李四";
    // p1.m_Car = "奔驰";      //保护权限内容,在类外访问不到
    // p1.m_Password = "22222";       //私有权限内容,在类外访问不到

    p1.func();


    return 0;
}

2. struct和class的区别

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

区别:

  • struct默认权限为公共
  • class默认权限为私有
#include <iostream>
using namespace std;

class C1
{
    int m_A;    //默认权限是公共
};

struct C2
{
    int m_A;    //默认权限是公共
};
int main()
{
    //struct默认权限是公共 public,class默认权限是私有 private

    C1 c1;
    //c1.m_A = 100;   //在class里默认权限为私有,因此类外不可以访问

    C2 c2;
    c2.m_A = 100;   //在struct默认的权限为公共,因此可以访问

    return 0;
}

3. 成员属性设置为私有

优点:

  • 将所有成员属性设置为私有,可以自己控制读写权限;
  • 对于写权限,我们可以检测数据的有效性;
#include <iostream>
#include <string>
using namespace std;

//成员属性设置为私有
//1. 可以自己控制读写权限
//2. 对于写,可以检测数据的有效性

//设计人类
class Person
{
public:
    //设置姓名
    void setName(string name)
    {
        m_Name = name;
    }
    //获取姓名
    string getName()
    {
        return m_Name;
    }
    
    //设置年龄
    void setAge(int age)
    {
        if (age < 0 || age > 160)
        {
            cout << "年龄不太对吧?" << endl;
            return;
        }
        m_Age = age;
    }

    //获取年龄
    int getAge()
    {
        return m_Age;     
    }

    //设置情人
    void setLover(string m_Lover)
    {
        m_Lover = "苍井";
    }

private:
    string m_Name;      // 姓名,可读可写
    int m_Age;           //age,可读
    string m_Lover;    //情人,可写
};

int main()
{
    Person p;
    p.setName("张三");
    p.setAge(18);
    p.setLover("苍井");

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

【C++】封装的详细介绍 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri

随机推荐

  • 总结使用libwebsockets开发接入层

    作者 邹祁峰 邮箱 Qifeng zou job hotmail com 博客 http blog csdn net qifengzou 日期 2015 12 13 2015 12 14 转载请注明来自 祁峰 的CSDN博客 1 引言 We
  • 苹果核 - Tangram 1.0技术架构

    上一篇文章介绍了Tangram的开发思路和发展历程 本文将对Tangram 1 0的技术架构做一个概括性的说明 读者如果要了解更多的技术细节可以访问Tangram主页查看详细文档 Tangram作为一个面向常规业务产品的解决方案由3个部分组
  • idea使用gerrit提交报错:missing Change-Id in commit message footer

    异常表现 commit push直接推送正常 commit push 勾选Push to Gerrit 报错 提示 remote remote Processing changes refs 1 remote Processing chan
  • STL之栈

    一 什么是栈 栈也是一种操作 或者说运算 受到限制的特殊线性表 其插入和删除操作都限制在表的一端进行 这一端被称为 栈顶 top 相对的另一端称为 栈底 bottom 两种操作 1 进栈 PUSH 或者 压栈 2 出栈 POP 栈的特点是
  • Android中必须学习的八大开源项目

    欢迎Follow我的GitHub 关注我的CSDN 其余参考Android目录 转载请注明出处 http blog csdn net xiaole0313 article details 52562041 1 Ghost 微影 一款纯粹的在
  • 伺服速度控制模式接线图_PLC采用转矩、位置、速度模式控制伺服电机的方法

    原标题 PLC采用转矩 位置 速度模式控制伺服电机的方法 今天为大家讲解的是关于PLC控制伺服电机三种方式 一 转矩控制 二 位置控制 三 速度模式 一 转矩控制 转矩控制方式是通过外部模拟量的输入或直接的地址的赋值来设定电机轴对外的输出转
  • top-K 算法总结

    问题描述 有 N N gt 1000000 个数 求出其中的前K个最小的数 又被称作topK问题 1 最基本思路 将N个数进行完全排序 从中选出排在前K的元素即为所求 有了这个思路 我们可以选择相应的排序算法进行处理 目前来看快速排序 堆排
  • 【APT检测——论文精读】SLEUTH: Real-time Attack Scenario Reconstruction from COTS Audit Data

    2017 USENIX Security 顶会 Abstract 提出了一种实时重建企业主机攻击场景的方法和系统 为了满足问题的可扩展性和实时性需求 我们开发了一个平台中立的 基于主存的 并使用依赖图来抽象审计数据 然后 我们提出了有效的
  • redux成员、store成员、redux的数据流转、redux如何配合react-redux使用?react-redux的常用API、react-redux、redux和vuex的区别是什么?

    文章目录 前言 一 redux 1 redux三大原则 2 redux的安装 3 redux成员 4 store成员 5 数据流动 6 redux操作流程 7 action里处理异步 8 combineReducers提取reducer 二
  • java实验:电商购物平台(demo)

    课程融合之电商购物平台 将之前所学的知识都融合起来运用 是我目前做过最复杂的项目 不出意外会长期更新 文章目录 前言 实验内容 根据电商购物平台项目需求说明书的要求 抽象出电商购物平台中商品类目类和商品类 并用数组模拟商品数据库 完成商品信
  • vue el-table动态表格表头+对应数据

    vue el table动态表格创建 动态渲染表头 动态匹配表头对应数据 在这里插入代码片
  • SQLmap常用命令/使用教程

    SQLmap是一款自动化SQL注入神器 用于SQL注入漏洞的检测和利用 支持多种数据库 检测位置 u 指定url GET请求 p 指定参数 url包含多个参数时 指定参数 data 指定POST请求参数 cookie 指定cookie参数
  • 线性代数06 矩阵的逆以及求法

    我们已经了解了对于方程组来说 如何根据他的系数矩阵的变化 来实现高斯 诺尔当消元算法 并可以快速的判断方程组的解的情况 这样看上去非常的完美 但是我们在线性代数中 还有一个非常重要的部分就是矩阵的运算 似乎除了初等变换以外 现在目前还对任何
  • 可以这样学习linux命令

    通过综合练习 可以强化linux命令的学习 带着问题学习linux命令及其相关知识 是十分有效的方法 我们通过查询当前目录下的子目录这个问题 学习与训练linux 中一些重要命令 综合练习强于单个命令的分散学习 知识的串联 可以打通知识结点
  • python数组(矩阵)乘法(点乘、叉乘)

    转载 https blog csdn net haiziccc article details 101361583 总结 1 tf matmul A C np dot A C A C都属于叉乘 而tf multiply A C A C A
  • STM32的IAP在线升级

    IAP简介 简介部分copy自正点原子 IAP In Application Programming 即在应用编程 IAP 是用户自己的程序在运行过程中对User Flash 的部分区域进行烧写 目的是为了在产品发布后可以方便地通过预留的通
  • redhat 6.4安装oracle11g RAC (三)

    为数据和快速恢复去创建ASM磁盘组 只在节点rac1执行即可 进入grid用户下 grid rac1 grid srvctl status asm a ASM is running on rac2 rac1 ASM is enabled g
  • 快速浮点开方运算

    二分法 浮点开方也就是给定一个浮点数x 求根号x 这个简单的问题有很多解 我们从最简单最容易想到的二分开始讲起 利用二分进行开平方的思想很简单 就是假定中值为最终解 假定下限为0 上限为x 然后求中值 然后比较中值的平方和x的大小 并根据大
  • FISCO BCOS(二十)——— FISCO BCOS多群组搭建

    1 创建文件夹 创建目录 root wyg virtual machine mkdir fisco 2 创建配置文件 root wyg virtual machine fisco vim ipconf 3 建链 root wyg virtu
  • 【C++】封装的详细介绍

    目录 1 封装的意义 2 struct和class的区别 3 成员属性设置为私有 1 封装的意义 封装是C 面向对象的三大特性之一 封装的意义 1 将属性和行为作为一个整体 表现生活中的事物 2 将属性和行为加以权限控制 public公共权