浅谈C++|类的封装篇

引子:

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

人可以作为对象,属性有姓名,年龄,身高,体重等,行为有行走,吃饭,唱歌等。

车也可以作为一个对象,属性有轮胎,方向盘,车灯等,行为有载人,放音乐等。

1.封装

1.1封装的意义

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

封装的意义:

  (1)将属性和行为作为一个整体,表现生活中的事物。

  (2)将属性和行为加以权限控制。

1.1.1封装意义一:

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

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

实例:设置一个长方体类,并求其体积

代码:

#include <iostream>
using namespace std;
class cuboid {
public:int height;int weight;int length;int show_tiji() {return height * weight * length;}
};
int main() {cuboid a1;a1.height = 10;a1.weight = 10;a1.length = 90;cout << a1.show_tiji();return 0;
}

 1.1.2封装的意义二

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

访问权限有三种:

1.public        公有权限,类内可以访问,类外可以访问

2.protected   保护权限,类内可以访问,类外不可以访问

3.private       私有权限,类内可以访问,类外不可以访问

代码: 

#include <iostream>
using namespace std;
class people {
public:string name;
protected:string hose;
private:int m_Password;
public:void fun() {name = "小明";hose = "别墅";m_Password = 12345;}};
int main() {people a;a.fun();cout << a.name << endl;//cout << a.hose << endl;   //报错//cout << a.m_Password << endl;   //报错return 0;
}

1.2struct和class的区别

1.2.1默认权限不同

权限分为成员访问权限和继承权限

默认成员权限:class是私有的,struct是公有的

默认继承权限:class是private,struct是public

默认成员权限代码: 

#include <iostream>
using namespace std;
class people1 {int a;
};
struct people2 {int a;
};
int main() {people1 a1;people2 a2;//a1.a = 100;   //报错a2.a = 100;return 0;
}

默认继承权限代码: 

#include <iostream>
using namespace std;
struct A {int m_a;
};struct B :A {int m_b;
};
int main() {B b;b.m_a = 100;return 0;
}

struct默认为公有继承;

#include <iostream>
using namespace std;
class A {
public:int m_a;
};class B :A {
public:int m_b;
};
int main() {B b;b.m_b = 100;//b.m_a = 100;return 0;
}

class默认私有继承

1.2.2能否定义模板参数

class可以定义模板参数  template<class  T>,而没有template<struct T>

 代码:

#include <iostream>
using namespace std;
//template< typename T, typename Y >	
template< class T >	
void  Func(T& t,T& y)
{T temp = t;t = y;y = temp;
}int main() {int a = 10, b = 20;Func(a, b);cout << a << ' ' << b << endl;return 0;
}

1.2.3 class和struct相互继承

 默认的继承属性取决于子类而不是基类

代码: 

#include <iostream>
using namespace std;
class A {
public:int m_A;
};
struct B:A {int m_B;
};int main() {B b;b.m_A = 10;b.m_B = 20;cout << b.m_A <<' '<<b.m_B << endl;return 0;
}

struct作为子类,默认公有继承

代码: 

#include <iostream>
using namespace std;
struct A {int m_A;
};
class B:A {
public:int m_B;
};int main() {B b;//b.m_A = 10;  报错b.m_B = 20;cout<<b.m_B << endl;return 0;
}

1.2.4{}赋初值的讨论

因为C++是对C的扩充,那么它就兼容过去C中struct的特性

#include <iostream>
using namespace std;
struct A
{char 	a1;int		a2;double	a3;
};int main() {A a = { 'p', 7, 451.154 }; //定义时赋初值,在struct时没问题,在class时出错return 0;
}

在struct中加入一个构造函数(或虚函数),struct也不能用{}赋值了,原因是以{}的方式来赋值,只是用一个初始化列表来对数据进行按顺序的初始化,如果上面写成A a = {‘p’,7};则a1,a2被初始化,而a3没有。这样简单的copy操作,只能发生在简单的数据结构上,而不应该放在对象上。加入一个构造函数或是一个虚函数会使strcut更体现出一种对象的特性,而是{}操作不再有效。因为加入这样的函数(构造和虚函数),使得类的内部结构发生了变化。而加入一个普通的成员函数呢?你会发现{}依旧可用。其实你可以将普通的函数理解成对数据结构的一种算法,这并不打破它数据结构的特性。
 

1.2.5总结 

  • 结构是实值类型(Value Types),而类则是引用类型(Reference Types)。
  • 结构使用栈存储(Stack Allocation),而类使用堆存储(Heap Allocation)。

值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。
 

概念:class和struct的语法基本相同,从声明到使用,都很相似,但是struct的约束要比class多,理论上,struct能做到的class都能做到,但class能做到的stuct却不一定做的到
类型:struct是值类型,class是引用类型,因此它们具有所有值类型和引用类型之间的差异
效率:由于栈的执行效率要比堆的执行效率高,但是栈资源却很有限,不适合处理逻辑复杂的大对象,因此struct常用来处理作为基类型对待的小对象,而class来处理某个商业逻辑
关系:struct不仅能继承也能被继承 ,而且可以实现接口,不过Class可以完全扩展。内部结构有区别,struct只能添加带参的构造函数,不能使用abstract和protected等修饰符,不能初始化实例字段
 

1.2.6选用技巧

(1) 在表示诸如点、矩形等主要用来存储数据的轻量级对象时,首选struct

(2) 在表示数据量大、逻辑复杂的大对象时,首选class

(3) 在表现抽象和多级别的对象层次时,class是最佳选择 

1.3成员属性设置为私有化好处

1.3.1控制读写权限

可读可写权限,只读权限,只写权限

代码: 

#include <iostream>
using namespace std;
class people {
public:void get_name(string name_1) {name = name_1;          //写权限}string show_name() {return name;           //读权限}void get_mima(string mima1) {mima = mima1;          //写权限}int show_age() {           //读权限return age;}
private://可读,可写string name;//只读int age;//只写string mima;};
int main() {people p;p.get_name("小明");cout << p.show_name() << endl;p.get_mima("56789");cout << p.show_age();  //没有设置,随机值return 0;
}

 1.3.2写权限检测数据的有效性

 代码:

#include <iostream>
using namespace std;
class people {
public:void get_name(string name_1) {name = name_1;          //写权限}string show_name() {return name;           //读权限}void get_mima(string mima1) {if (mima1.size() < 3) {cout << "密码太短,无效!" << endl;return;}mima = mima1;          //写权限}int show_age() {           //读权限return age;}
private://可读,可写string name;//只读int age;//只写string mima;};
int main() {people p;p.get_name("小明");cout << p.show_name() << endl;p.get_mima("59");cout << p.show_age();  //没有设置,随机值return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jetpack Compose 介绍和快速上手

Compose版本发展 19年&#xff0c;Compose在Google IO大会横空出世&#xff0c;大家都议论纷纷&#xff0c;为其前途堪忧。 21年7月Compose 1.0的正式发布&#xff0c;却让大家看到了Google在推广Compose上的坚决&#xff0c;这也注定Compose会成为UI开发的新风向。 23年1月…

千里共婵娟 | 结合微信公众号用JavaScript完整开发实现换中秋头像的功能

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责…

uni-app运行到微信开发者工具-没有打印的情况

前言 到我们进场使用微信开发者工具时&#xff0c;就会发现它经常会有bug&#xff0c;特别是在软件更新&#xff0c;组件库更新之后 最近在更新微信开发者工具之后发现所有打印都不显示了&#xff0c;虽然是小问题-但对于强迫症很烦 以为是代码配置问题-结果是更新之后打印开…

制作ubuntu18.04系统盘

文章目录 前言一、下载ubuntu18.04的iso文件二、制作u盘系统盘2、使用ultra来制作系统盘2.1、加载iso2.2、制作系统盘 前言 安装ubuntu18.04系统 一、下载ubuntu18.04的iso文件 打开下面的网址&#xff0c;找到自己需要的iso文件 https://releases.ubuntu.com/二、制作u盘系…

任意区域的色彩一致性处理方法

影像任意感兴趣区域的色彩一致性处理方法&#xff0c;主要是针对掩膜后的影像&#xff0c;类似下图&#xff0c;对非背景区域的像素进行处理 其中非黑色部分我们叫待匀色区域。 这种处理 对于wallis 和直方图匹配 很容易实现&#xff0c;但是颜色转移就相对而言 困难点。 颜…

解决中国科大 USTC 邮箱系统的超大附件上传的邮箱控件安装问题

USTC邮箱系统上传超过 48M 的附件的步骤&#xff1a; 从文件中转站上传文件&#xff0c;会提示下载邮箱控件 cmplugin_setup.exe &#xff0c;默认安装C盘即可 2. 安装好之后依然无法上传超大文件&#xff0c;因为只有 IE 浏览器支持该功能&#xff0c;所以可以使用 Edge 浏览…

华为云云耀云服务器L实例评测|Git 私服搭建指南

前言 本文为华为云云耀云服务器L实例测评文章&#xff0c;测评内容是 云耀云服务器L实例 Git 私有服务器搭建指南 系统配置&#xff1a;2核2G 3M Ubuntu 20.04 我们平时在使用代码托管服务的时候&#xff0c;可能某些代码托管平台对成员有限制&#xff0c;或是由于内容原因会对…

Python中异常处理4-4

在Python中的异常处理4-1_棉猴的博客-CSDN博客中提到&#xff0c;在try块中的代码运行时如果出现异常&#xff0c;会自动抛出这个异常。可以通过raise语句手动抛出异常。 1 raise语句手动抛出异常 raise后面跟要抛出的异常类或者异常类的实例&#xff0c;表示手动抛出该异常&…

【基于Cocos Creator 3.5的赛车游戏】8.引入触摸屏幕事件并简单的控制小车

转载知识星球 | 深度连接铁杆粉丝&#xff0c;运营高品质社群&#xff0c;知识变现的工具 项目地址&#xff1a;赛车小游戏-基于Cocos Creator 3.5版本实现: 课程的源码&#xff0c;基于Cocos Creator 3.5版本实现 上一张您已经对Cocos的坐标系有了了解。这一章我们将让小车能…

Python __slots__:限制类实例动态添加属性和方法

​通过学习《Python类变量和实例变量》一节&#xff0c;了解了如何动态的为单个实例对象添加属性&#xff0c;甚至如果必要的话&#xff0c;还可以为所有的类实例对象统一添加属性&#xff08;通过给类添加属性&#xff09;。​ ​ 那么&#xff0c;Python 是 ​否也允许动态地…

MySQL 约束与复杂查询

当涉及到数据库管理系统&#xff08;DBMS&#xff09;的高级主题时&#xff0c;包括数据库的约束、表的设计以及各种类型的查询&#xff0c;特别是聚合查询、联合查询和合并查询&#xff0c;是非常重要的。这些主题可以帮助我们更好地理解数据库的内部工作机制以及如何有效地操…

二叉搜索树经典笔试题【力扣、牛客】

文章目录 1.根据二叉树创建字符串2. 二叉树的层序遍历3.二叉树的层序遍历Ⅱ4.二叉树的最近公共祖先1.法一&#xff1a;定位p、q在左还是右 分类讨论2.法二&#xff1a;利用stack求出p、q路径 求相交值 5.二叉搜索树与双向链表1.法一&#xff1a;递归&#xff1a;递归过程修正指…

Acwing 828. 模拟栈

Acwing 828. 模拟栈 题目要求思路讲解代码展示 题目要求 思路讲解 栈&#xff1a;先进后出 队列&#xff1a;先进先出 代码展示 #include <iostream>using namespace std;const int N 100010;int m; int stk[N], tt;int main() {cin >> m;while (m -- ){string o…

java创建excel文件和解析excel文件

创建excel文件 package com.bjpowernode.crm.poi;import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.HorizontalAlignment;import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.…

leetcode刷题(简单篇):9.回文数

9.回文数 题目描述&#xff1a;给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如&…

mybatis mapper.xml转建表语句

从网上下载了代码&#xff0c;但是发现没有DDL建表语句&#xff0c;只能自己手动创建了&#xff0c;感觉太麻烦&#xff0c;就写了一个工具类 将所有的mapper.xml放入到一个文件夹中&#xff0c;程序会自动读取生成建表语句 依赖的jar <dependency><groupId>org.d…

关于Python数据分析,这里有一条高效的学习路径

无处不在的数据分析 谷歌的数据分析可以预测一个地区即将爆发的流感&#xff0c;从而进行针对性的预防&#xff1b;淘宝可以根据你浏览和消费的数据进行分析&#xff0c;为你精准推荐商品&#xff1b;口碑极好的网易云音乐&#xff0c;通过其相似性算法&#xff0c;为不同的人…

Python中Mock和Patch的区别

前言&#xff1a; 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 在测试并行开发&#xff08;TPD&#xff09;中&#xff0c;代码开发是第一位的。 尽管如此&#xff0c;我们还是要写出开发的测试&#xff0c…

教育领域数据可视化:点亮知识之路

教育领域一直以来都在不断进步和演变&#xff0c;而数据可视化技术正在为这一领域带来一场革命。在过去的几年里&#xff0c;教育者们越来越意识到&#xff0c;通过将教育数据转化为可视化图表和图形&#xff0c;可以更好地理解学生的表现、需求和趋势&#xff0c;从而提供更好…

科学计算器网站Desmos网站

科学计算器网站Desmos网站 有时在学习工作或者生活中&#xff0c;需要用到计算问题&#xff0c;但由于电脑上没有安装相应的专业软件&#xff0c;难以计算有的问题&#xff0c;因而&#xff0c;本文推荐一种免费的在线计算网站Desmos。 一、Desmos网址 Desmos官网的地址为&a…