首页 > 编程语言 >C++学习日记---第13天(类和对象---封装)

C++学习日记---第13天(类和对象---封装)

时间:2024-11-27 18:33:15浏览次数:13  
标签:13 set return get int C++ --- c1 权限

笔记复习

1.类和对象

c++面向对象的三大特性为:封装,继承,多态
c++认为万事万物都皆为对象,对象上有其属性和行为
具有相同性质的对象,我们可以抽象为称为类

2.封装

作用:将属性和行为作为一个整体,表现生活中的事物,具有相同性质的对象,我们可以抽象为类。

语法:class 类名{访问权限(也可不写,默认为private):属性/行为};

示例:

class circle{
public:
    int m_r;
    double calculator(){
        return 2*pi*m_r;
    }

}

封装案例:计算一个圆的周长

#include<iostream>
using namespace std;

const double pi = 3.14;
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;
	system("pause");
	return 0;
}

对比结构体我们不难发现,类与结构体可以说一模一样,但实际上类与结构体的区别很大,不过难度过高,我们这里不做深入探讨,下面我们来学习类的访问权限

3.类的访问权限

1)分类

访问权限一共有一下三种:

a.public         公共权限                                            其中的成员类内可以访问,类外也可以访问

b.protected    保护权限                                            其中的成员类内可以访问,类外不可以访问

对于protected权限,特定人员有权访问

c.private         私有权限                                           其中的成员类内可以访问,类外不可以访问

对于private权限,除本人外其他人无权访问

实际上在结构体struct中也有权限,不过与类class的区别是,struct的默认权限是公共权限,class的默认权限是私有权限

2)访问权限的作用

在实际的编程项目中,我们通常将类的对象的属性设置为私有,而类中的函数则设置为公有。

例如:

class student{
public:
    int let_you_see_it(){
        return age;
}
private:
    int age=18;
}

利用这一操作,我们可以自己设置类对象属性的只读,只写,读写操作,代码如下:

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

class person {//创建一个person结构体
public:
	void set_name(string name) {//定义一个函数来接收数据,然后将数据赋给私有权限中的数据
		m_name = name;
		//这个函数无返回值,故要返回字符串需要创建一个string函数
	}
	string get_name() {
		return m_name;
	}
	int get_age() {
		return m_age;//类内可以访问私有成员
	}
	void set_idol(string idol) {
		m_idol = idol;//没有返回值,只写
	}
private:
	string m_name; //可读可写
	int m_age=18;//只读
	string m_idol;//只写
};

int main() {
	person p;
    //创建一个person中的p对象
	p.set_name("张三");
	cout << "姓名:" << p.get_name() << endl;
	cout << "年龄:" << p.get_age() << endl;
	p.set_idol("小明");

	system("pause");
	return 0;
}

4.类案例:长方体类

案例要求:

1)创建立方体类

2)设计属性

3)设计行为,获取立方体面积和体积

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

我们仍然使用上面的方法,将属性设置为私有,并通过成员函数来修改和获取属性的值

我们将代码实现分为三个部分,第一部分是设置属性,完成面积体积的计算,第二部分是用全局函数判断两个立方体是否相等,第三部分是用成员函数判断,下面给出第一部分的代码:

#include<iostream>
using namespace std;

class cube {
public:
	void set_l(int l) {
		m_l = l;
	}
	int get_l() {
		return m_l;
	}
	void set_w(int w) {
		m_w = w;
	}
	int get_w() {
		return m_w;
	}
	void set_h(int h) {
		m_h = h;
	}
	int get_h() {
		return m_h;
	}
	int calculateS() {
		return 2 * m_l * m_w + 2 * m_w * m_h + 2 * m_l * m_h;
	}
	int calculateV() {
		return m_l * m_w * m_h;
	}
private:
	int m_l;
	int m_w;
	int m_h;
};

int main() {
	cube c1;
	c1.set_l(10);
	c1.set_w(20);
	c1.set_h(30);
	cout <<"c1的面积为"<< c1.calculateS() << endl;
	cout <<"c1的体积为"<< c1.calculateV() << endl;

	return 0;
}

第二部分代码为:

bool isSame1(cube& c1, cube& c2) {
	if (c1.get_l() == c2.get_l() && c1.get_w() == c2.get_w() && c1.get_h() == c2.get_h()) {
		return true;
	}
	return false;
}

第三部分代码为:

bool isSame2(cube& c) {
	//这里传递的参数一个就可以,因为我们是用已知的一个对象去调用未知的一个对象
	if (m_l == c.get_l() && m_w == c.get_w() && m_h == c.get_h()) {
		return true;
	}
	return false;
}

完整代码如下:

#include<iostream>
using namespace std;

class cube {
public:
	void set_l(int l) {
		m_l = l;
	}
	int get_l() {
		return m_l;
	}
	void set_w(int w) {
		m_w = w;
	}
	int get_w() {
		return m_w;
	}
	void set_h(int h) {
		m_h = h;
	}
	int get_h() {
		return m_h;
	}
	int calculateS() {
		return 2 * m_l * m_w + 2 * m_w * m_h + 2 * m_l * m_h;
	}
	int calculateV() {
		return m_l * m_w * m_h;
	}
	bool isSame2(cube& c) {
		//这里传递的参数一个就可以,因为我们是用已知的一个对象去调用未知的一个对象
		if (m_l == c.get_l() && m_w == c.get_w() && m_h == c.get_h()) {
			return true;
		}
		return false;
	}
private:
	int m_l;
	int m_w;
	int m_h;
};

bool isSame(cube& c1, cube& c2) {
	if (c1.get_l() == c2.get_l() && c1.get_w() == c2.get_w() && c1.get_h() == c2.get_h()) {
		return true;
	}
	return false;
}

int main() {
	cube c1;
	c1.set_l(10);
	c1.set_w(20);
	c1.set_h(30);
	cout <<"c1的面积为"<< c1.calculateS() << endl;
	cout <<"c1的体积为"<< c1.calculateV() << endl;
	cube c2;
	c2.set_l(10);
	c2.set_w(10);
	c2.set_h(30);
	cout << "c2的面积为" << c2.calculateS() << endl;
	cout << "c2的体积为" << c2.calculateV() << endl;
	bool ret1 = isSame(c1,c2);//引用传递
	if (ret1) {
		cout << "全局函数:两个立方体相等" << endl;
	}
	else {
		cout << "全局函数;两个立方体不相等" << endl;
	}
	bool ret2 = c1.isSame2(c2);
	//这里如果是用c1作为对象,那么传入c2即可,如果是c2作为对象,那么传入c1
	if (ret2) {
		cout << "成员函数:两个立方体相等" << endl;
	}
	else {
		cout << "成员函数;两个立方体不相等" << endl;
	}

	return 0;
}

标签:13,set,return,get,int,C++,---,c1,权限
From: https://blog.csdn.net/wlyyywwq/article/details/144053570

相关文章

  • #20222309 2024-2025-1 《网络与系统攻防技术》实验五实验报告
    1.实验内容(1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息:DNS注册人及联系方式该域名对应IP地址IP地址注册人及联系方式IP地址所在国家、城市和具体地理位置PS:使用whois、dig、nslookup、traceroute、以及各类在线和离线工具进行搜集信......
  • zabbix-server is not running 报错解决
    前提是我什么都没动zabbix-server,只是加主机关联模板等等,一定要仔细地看日志、看报错!!!(我也是,只是添加了几台交换机,就报错了)页面报错如下: 用命令查看状态systemctlstatuszabbix-server,如下 systemctlrestartzabbix-server也不行systemctlrestartzabbix-serverzab......
  • 泷羽sec-星光不负a-学习打卡-安全见闻(3)
    声明学习视频来自B站UP主泷羽sec,如涉及侵权马上删除文章笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负脚本语言又被称为动态语言,是一种编程语言,用来控制系统里的软件应用程序,脚本通常以文本(如ASCII)保存,只有......
  • HarmonyOS Next 入门实战 - 导航框架:页面路由、组件导航(Navigation)
    页面路由官方不推荐使用页面路由,这里仅做简单介绍。页面路由用于标识@Entry注解的页面间的跳转。包引入import{router}from'@kit.ArkUI';页面跳转router.pushUrl目标页面不会替换当前页,而是压入页面栈router.replaceUrl目标页面会替换当前页,并销毁当前页Router......
  • vxe-table 实现表格数据分组,按指定字段数据分组
    实现表格数据分组,按指定字段数据分组,使用树结构来实现分组功能。官网:https://vxetable.cn<template><div><vxe-gridv-bind="gridOptions"></vxe-grid></div></template><script>importXEUtilsfrom'xe-utils'constal......
  • 洛谷题单指南-线段树-P3870 [TJOI2009] 开关
    原题链接:https://www.luogu.com.cn/problem/P3870题意解读:有n个数的序列,初始都是0,支持两种操作:将区间[l,r]内所有数异或1,求区间[l,r]内1个个数,输出所有求区间1的个数操作的结果。解题思路:灯的开关可以用0,1表示,改变灯的状态可以用异或操作,统计多少灯是开的就是计算1的个数,因此......
  • vue-admin-template学习
    vue-admin-template权限篇参考网址-https://juejin.cn/post/6844903478880370701思路:-不同权限对应不同的路由-侧边栏也需要根据不同的权限,异步生成实现逻辑-用户名和密码校验是否正确 -正确返回token,存储到cookie(记住用户登录状态) -带着token向后端......
  • LLMs Learn Task Heuristics from Demonstrations: A Heuristic-Driven Prompting St
    1.概述关于基于COT的Prompt构造有很多的研究,例如:CoT(Weietal.,2022),Automate-CoT(Shumetal.,2023),Auto-CoT(Zhangetal.,2023),Iter-CoT(Sunetal.,2023),Active-CoT(Diaoetal.,2023)。本篇文章尝试给出了一种解释:LLM基于有监督的ICL(in-contextlearni......
  • 一个新的音乐管理软件--JxAudio
    介绍JxAudio是一个基于.netcore的音频管理系统,支持音乐的播放、上传、下载、删除等功能。兼容Subsonic协议,可以使用Subsonic客户端进行访问。支持Windows、Linux、MacOS等操作系统。目前只提供Docker部署方式,其他方式须自行编译安装包,Windows和Linux提供ffmpeg二进制文件,MacOS......
  • 7. vulnhub渗透测试综合靶场DC-7
    目录信息收集渗透测试本次渗透测试学习收获信息收集arp-scan扫描主机arp-scan192.168.200.0/24nmap扫描nmap-sS192.168.200.152查看网站信息whatwebhttp://192.168.200.152利用网站分析插件看到CMS:Drupal8渗透测试目录爆破发现后台dirsearch-uhttp......