浅谈C++|类的封装篇

news2025/1/16 6:47:24

引子:

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.coloradmin.cn/o/1016397.html

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

相关文章

学生信息登录系统(下)——判断循环语句(五)(for循环篇)

#include <iostream> using namespace std; int main() {bool student[46] 0; //student[0]空出不用int bianhao 0;cin >> bianhao;student[bianhao] 1;return 0; } /* 可是&#xff0c;这个程序只能执行一遍&#xff0c;一次只能录入一个学生&#xff0c;并…

网络请求【小程序】

一、get 二、post 1.获取相应数据 Page({/*** 页面的初始数据*/data: { inptValue:, isArr:[]},/*** 生命周期函数--监听页面加载*/onLoad(options) {},onSubmit(){// console.log(this.data.inptValue)//2.后台请求数据wx.request({url: https://tea.qingnian8.com/demoArt/…

esxi网卡直通后虚拟机无网

出现选网卡的时候无法选中&#xff0c;这里应该是一个bug。 解决方法如下&#xff1a; 1.先随便选择一个网卡 2.勾先取消再重新勾选 3.保存退出&#xff0c;重启虚拟机即可

机器学习 day34(机器学习项目的完整周期、精确度和召回率、F1)

机器学习项目的完整周期 第一步&#xff0c;决定项目是什么。第二步&#xff0c;收集数据。第三步&#xff0c;训练模型&#xff0c;进行错误分析并改进模型&#xff0c;可能会回到第二步。第四步&#xff0c;当模型足够好后&#xff0c;部署在生产环境中&#xff0c;继续监控…

竞赛选题 基于深度学习的人脸专注度检测计算系统 - opencv python cnn

文章目录 1 前言2 相关技术2.1CNN简介2.2 人脸识别算法2.3专注检测原理2.4 OpenCV 3 功能介绍3.1人脸录入功能3.2 人脸识别3.3 人脸专注度检测3.4 识别记录 4 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的人脸专注度…

阿里云服务器上CentOS 7.6使用rpm包安装MySQL 8.0.31

我这里下载的是最新版本&#xff0c;需要到MySQL官网最新版本下载地址。 要是想要下载以前的版本需要到MySQL以前版本网址中。 1&#xff09;先使用wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.31-1.el7.x86_64.rpm-bundle.tar&#xff08;这个网址现在已经不…

【C语言】用冒泡排序实现my_qsort

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解如何用冒泡排序实现my_qsort&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 前言二. 冒泡排序三. 4个参数3.1 第一个参数void* base3.2 第二个参数…

驱动开发,stm32mp157a开发板的led灯控制实验(再优化),使用ioctl函数,通过字符设备驱动分步注册方式编写LED驱动,完成设备文件和设备的绑定

1.实验目的 编写LED灯的驱动&#xff0c;在应用程序中编写控制LED灯亮灭的代码逻辑实现LED灯功能的控制&#xff1b; 2. LED灯相关寄存器分析 LED1->PE10 LED1亮灭&#xff1a; RCC寄存器[4]->1 0X50000A28 GPIOE_MODER[21:20]->01 (输出) 0X50006000 GPIOE_ODR[10]-&…

CTyunOS安装MySQL8.0

CTyunOS安装MySQL8.0 1.yum安装2. 启动配置3.注意事项 最近天翼云搞活动&#xff0c;购了一台4U8G的服务器&#xff0c;这里讲解一下如何安装Mysql吧。 1.yum安装 yum install -y mysql yum install -y mysql-common yum install -y mysql-errmsg yum install -y mysql-libs y…

Jenkins :添加node权限获取凭据、执行命令

拥有Jenkins agent权限的账号可以对node节点进行操作&#xff0c;通过添加不同的node可以让流水线项目在不同的节点上运行&#xff0c;安装Jenkins的主机默认作为master节点。 1.Jenkins 添加node获取明文凭据 通过添加node节点&#xff0c;本地监听ssh认证&#xff0c;选则凭…

Ansible 自动化运维工具部署主从数据库+读写分离

文章目录 Ansible 自动化运维工具部署主从数据库读写分离一、主从复制和读写分离介绍二、准备工作&#xff08;1&#xff09;节点规划&#xff08;2&#xff09;修改主机名&#xff08;3&#xff09;免密&#xff08;4&#xff09;配置IP映射&#xff08;5&#xff09;安装ansi…

电荷型 和 IEPE/ICP型振动传感器的比较

PE(压电式)和IEPE(集成电路压电式,PCB公司叫做ICP)传感器的对比说明,供各位参考。 1. PE/IEPE传感器的敏感元件均为压电晶体,通过压电效应感受被测物理量。 2.PE传感器:输出电荷量,也叫电荷传感器。不需要供电,两根信号线,可直接接入电荷放大器进行测量。 优点―――结…

Java————List

一 、顺序表和链表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c; 常见的线性表&#xff1a;顺序表、链表、栈、队列… 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直…

基础篇之SDK编译

文章目录 一、 Ubuntu系统固件下载1. 固件下载2 放入SDK根目录中 二、编译SDK三、说明 一、 Ubuntu系统固件下载 1. 固件下载 在资源下载页面下载Ubuntu Rootfs固件&#xff0c;文件夹有三个文件&#xff0c;其区别如下&#xff0c;根据情况进行选择下载 资源名称作用Ubuntu2…

【毕设选题】opencv 图像识别 指纹识别 - python

文章目录 0 前言1 课题背景2 效果展示3 具体实现3.1 图像对比过滤3.2 图像二值化3.3 图像侵蚀细化3.4 图像增强3.5 特征点检测 4 OpenCV5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往…

网络安全深入学习第三课——热门框架漏洞(RCE—Struts2远程代码执行)

文章目录 一、Struts2框架介绍二、Struts2远程代码执行漏洞三、Struts2执行代码的原理四、Struts2框架特征五、漏洞手工POC六、漏洞工具复现 一、Struts2框架介绍 ------ Struts2是apache项目下的一个web 框架&#xff0c;普遍应用于阿里巴巴、京东等互联网、政府、企业门户网…

Linux——Shell脚本编程(2)

一、Shell变量 Linux Shell 中的变量分为&#xff0c;系统变量 和 用户自定义变量 (这个用的比较多)。 系统变量 : $HOME、$PWD、$SHELL、$USER 等等&#xff0c;比如 : echo $HOME 等等.. 显示当前shell中所有变量 : set 举例说明&#xff1a; 二、设置环境变量 记得在注释…

ReactNative 网络库

What JS判断网络状态不准确 react-native-netinfo在Android中的结构 type-CellularGeneration&#xff1a;G网模式枚举 type-ConnectionType&#xff1a;网络连接类型 AmazonFireDeviceConnectivityPoller&#xff1a;Amazon设备网络适配&#xff0c;可忽略 BroadcastRec…

DP专题1 斐波那契数列II

题目&#xff1a; 思路&#xff1a; 通过样例 3 &#xff0c;我们可以看出&#xff0c;将我们所对应的每个步骤进行拆分后&#xff0c;可以知道&#xff0c;每个步骤中都是调用了前面我们计算过的重复计算&#xff0c;所以这里的 dp[i] 中&#xff0c;i 表示 相应的Fbn(i) 的结…