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

devtools/2024/11/29 15:06:07/

笔记复习

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作为对象,那么传入c1if (ret2) {cout << "成员函数:两个立方体相等" << endl;}else {cout << "成员函数;两个立方体不相等" << endl;}return 0;
}


http://www.ppmy.cn/devtools/137947.html

相关文章

arm Rk1126 编译Qt工程报错: Could not find qmake spec

首先修改qmake.conf文件&#xff0c;配置好正确的交叉编译工具&#xff1a; 然后执行编译&#xff1a; /opt/Rv1126/Rv1126-盒子代码/rv1126-qt5-sdk/bin/qmake untitled.pro 报错。 原因&#xff1a;中文路径。修改路径为英文路径即可

【R库包安装】R库包安装总结:conda、CRAN等

【R库包安装】R库包安装总结&#xff1a;conda、CRAN等 方法1&#xff1a;基于 R 的 CRAN 仓库安装CRAN库包查询从 CRAN 安装 方法2&#xff1a;使用conda安装库包确保已安装 R 和 Conda 环境使用 Conda 官网浏览是否存在相应库包Conda 安装 R 库 方法3&#xff1a;从 GitHub 安…

Linux进程基础

前言&#xff1a;并行和并发 1.并发&#xff1a;在操作系统中是指一个时间段中有几个进程都处于正在运行到运行完毕之间&#xff0c;且它们都是在同一个处理器上运行的&#xff0c;抢占了共享的这个CPU资源 在用户的视角上&#xff0c;这些进程看似同时进行&#xff0c;但不是…

QT6学习第四天 感受QT的文件编译

QT6学习第四天 感受QT的文件编译 使用纯代码编写程序新建工程 使用其他编辑器纯代码编写程序并在命令行运行使用 .ui 表单文件生成界面使用自定义 C 窗口类使用现成的QT Designer界面类 使用纯代码编写程序 我们知道QT Creator中可以用拖拽的方式在 .ui 文件上布局&#xff0c…

【计算机网络】计算机网络概述

当我们决定要谈谈网络的时候&#xff0c;我想在谈之前&#xff0c;有必要了解一下“协议”这个词。协议&#xff0c;定义了在俩个或者多个通信实体之间交换报文的格式和次序&#xff0c;以及报文发送、接收报文或者其他的事件所采取的动作。定义都比较晦涩&#xff0c;那就让我…

QML学习 —— 33、弹出式菜单(附源码)

效果 说明 Menu菜单类型为本机平台菜单弹出式菜单提供QML API。 代码 import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.5 import QtQuick.Layouts 1.12Window {id: rootvisible:

解决Ubuntu下无法远程登录

1.检查 SSH 服务状态&#xff1a; sudo systemctl status ssh.service ssh服务状态正常 2.查看是否安装了SSH服务&#xff08;如果显示为空则没安装&#xff09; sudo ps -e |grep ssh 3.安装openssh-server sudo apt-get install openssh-server 4.查看是否安装成功 su…

Spring Boot英语知识网站:安全与维护

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了英语知识应用网站的开发全过程。通过分析英语知识应用网站管理的不足&#xff0c;创建了一个计算机管理英语知识应用网站的方案。文章介绍了英语知识应用网站的系…