4 类和对象

C++面向对象的三大特性为:封装,继承,多态
C++以为万事万物都皆为对象,对象上有其属性和行为

例如
人可以作为对象,属性有姓名,年龄,身高…行为有走路,吃饭…
车也可以作为对象,属性有轮胎,方向盘,车灯…行为有载人,放音乐…
具有相同性质的对象,我们可以抽象为,人属于人类,车属于车类

4.1 封装

4.1.1 封装的意义

封装是C++面对对象三大特性之一
封装的意义

  • 将属性和行为作为一个整体,表现生活中的事物
  • 将属性和行为加以权限控制
    封装意义一
    在设计类的时候,属性和行为写在一起,表现事物
    语法class 类名{ 访问权限:属性/行为};
    示例:设计一个圆类,求圆的周长
#include<bits/stdc++.h>
using namespace std;
const double PI=3.14;
//设计一个圆类,求圆的周长
//圆求周长的公式*PI*半径  //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;}

示例2:设计一个学生类,属性有姓名和学号,可以给学生姓名和学号赋值,可以显示学生的姓名和学号

#include<bits/stdc++.h>
using namespace std;
class Student
{public://公共权限//类中的属性和行为称为:成员 //属性 成员属性 成员变量//行为 成员函数 成员方法 string m_Name;int m_Id;//行为//显示姓名和学号void showStudent(){cout<<"姓名:"<<m_Name<<" "<<"学号:"<<m_Id<<endl;} //给姓名赋值void setName(string name){m_Name=name;}void setId(int id){m_Id=id;}
};
int main()
{//创建一个具体学生  实例化对象Student s1;//给s1对象进行属性赋值//s1.m_Name="太一";s1.setName("太一");s1.setId(520520);//s1.m_Id=520520;s1.showStudent();Student s2;s2.m_Name="乙太";s2.m_Id=521521;s2.showStudent(); }

封装意义二

  • 类在设计时,可以把属性和行为放在不同的权限下,加以控制
  • 访问权限有三种:
    1.public 公共权限:成员 在类内可以访问,类外也可以访问
    2.protected 保护权限:成员 类内可,类外不可
    3.private 私有权限:成员 类内可,类外不可

4.1.2 struct和class区别

尽管结构体可以包含成员函数,但它们很少这样做。所以,通常情况下结构体声明只会声明成员变量。
声明结构体的方式和声明类的方式大致相同,其区别如下:
使用关键字 struct 而不是关键字 class。
结构体声明通常不包括 public 或 private 的访问修饰符。

  • 唯一区别:默认的访问权限不同

    • struct 默认权限为公共
    • class 默认权限为私有

4.1.3 成员属性设置为私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性
示例:设计人类

#include<bits/stdc++.h>
using namespace std;
class Person
{public://设置姓名 void setName(string name){m_Name=name;} //获取姓名string getName(){return m_Name;} //获取年龄int getAge(){m_Age=0;//初始化return m_Age; } //设置年龄(有条件) void setAge(int age){if(age<0||age>150){age=0;cout<<"你不会是三体人吧!";return; }m_Age=age;} //设置情人void setLover(string Lover){m_Lover=Lover;}
private:string m_Name;//可读可写 int m_Age;//只读 string m_Lover;//只写
};
int main()
{Person p;p.setName("太一");cout<<"姓名为:"<<p.getName()<<endl; cout<<"年龄为:"<<p.getAge()<<endl; p.setLover("绫波丽");//cout<<"情人为:"<<p.getLover()<<endl; //外侧访问不到,且只能在内侧修改  p.setAge(1000);
}

练习案例1:设计立方体类

设计立方体类(Cube)
求出立方体的面积合体积
分别用全局函数和成员函数判断两个立方体是否相等

#include<bits/stdc++.h>
using namespace std;
class Cube
{public:void setL(int l)//设置长 {m_L=l;} int getL()//获取长 {return m_L;}void setW(int w)//设置宽{m_W=w;} int getW()//获取宽 {return m_W;}void setH(int h)//设置高{m_H=h;} int getH()//获取高 {return m_H;}//获取立方体的面积int calculateS(){return 2*m_H*m_L+2*m_L*m_W+2*m_H*m_W;} //获取立方体体积int calculateV(){return m_H*m_L*m_W;}
//利用成员函数判断两个立方体是否相等bool isSameByClass(Cube &c){if(m_L==c.getL() && m_W ==c.getW() && m_H ==c.getH()){return true;  }return false; }
private:int m_L;int m_W;int m_H;
};
//利用全局函数判断两个立方体是否相等‘
bool isSame(Cube &c1,Cube &c2)
{if(c1.getL()==c2.getL()&&c1.getW()==c2.getW()&&c1.getH()==c2.getH()){return true;}else return false;
}int main()
{//创建立方体对象Cube c1;c1.setL(10);c1.setW(10);c1.setH(10);cout<<"c1的面积是:"<<c1.calculateS()<<endl;cout<<"c1的体积是:"<<c1.calculateV()<<endl;Cube c2;c2.setL(10);c2.setW(10);c2.setH(18);//利用全局函数判断 bool ret=isSame(c1,c2);if(ret){cout<<"c1和c2是相等的"<<endl;}else{cout<<"c1和c2不相等"<<endl; } //利用成员函数判断ret=c1.isSameByClass(c2);if(ret){cout<<"c1和c2是相等的"<<endl;}else{cout<<"c1和c2不相等"<<endl; }
}

练习案例2 点和圆的关系

#include<bits/stdc++.h>
using namespace std;
//点和圆的关系的案例//点类
class Point
{int m_X;int m_Y;public://设置xvoid setX(int x) {m_X=x;} //获取xint getX() {return m_X;}//设置yvoid setY(int y) {m_Y=y;} //获取yint getY() {return m_Y;}}; class Circle
{private:int m_R;Point m_Center;//在类中可以让另一个类作为本来的成员 public://设置半径void setR(int r){m_R=r;} //获取半径int getR(){return m_R;}//设置圆心void setCenter(Point center){m_Center=center;} //获取圆心 Point getCenter(){return m_Center;}}; //判断点和圆的关系
void isInCircle(Circle &c,Point &p)
{//计算两点之间距离 平方 int distance=(c.getCenter().getX()-p.getX())*(c.getCenter().getX()-p.getX())+(c.getCenter().getY()-p.getY())*(c.getCenter().getY()-p.getY());//计算半径的平方int rDistance=c.getR()* c.getR();//判断关系if(distance==rDistance){cout<<"点在圆上"<<endl;} else if(distance>rDistance){cout<<"点在圆外"<<endl;}else{cout<<"点在圆内"<<endl;}
}int main()
{//创建圆Circle c; c.setR(10);Point center;center.setX(10);center.setY(0);c.setCenter(center);//创建点Point p;p.setX(10);p.setY(10);//判断关系 isInCircle(c,p);
} 

【C++成长日记07】相关推荐

  1. 网络工程师成长日记333-某城市政府项目

    网络工程师成长日记333-某城市政府项目 这是我的第333篇原创文章,记录网络工程师行业的点点滴滴,结交IT行业有缘之人 直接上干货,拓扑图: 工程目的:排除故障 配置如下: LinWei#show ...

  2. 网络工程师成长日记365-IBIS西安工程回忆录

    网络工程师成长日记365-IBIS西安工程回忆录 这是我的第365篇原创文章,记录网络工程师行业的点点滴滴,结交IT行业有缘之人 我的第一次真实工程经历 5.26日这一天我的心情是格外的兴奋,激动. ...

  3. 网络工程师成长日记421-某银行技术支持

    网络工程师成长日记421-某银行技术支持 这是我的第421篇原创文章,记录网络工程师行业的点点滴滴,结交IT行业有缘之人 由于昨天的任务没有完成,客户要求我们今天继续去完成昨晚没有完成的任务. 今天良 ...

  4. 网络工程师成长日记417-西安如家酒店无线覆盖技术支持

    网络工程师成长日记417-西安如家酒店无线覆盖技术支持 这是我的第417篇原创文章,记录网络工程师行业的点点滴滴,结交IT行业有缘之人 西安某汉庭连锁酒店WIFI部署项目报告 29日中午,我们来到位于 ...

  5. 网络工程师成长日记370-阿尔斯通

    网络工程师成长日记370-阿尔斯通 这是我的第370篇原创文章,记录网络工程师行业的点点滴滴,结交IT行业有缘之人 4月20日下午,我和老大一起去西高新的高科大厦去进行H3C防火墙的安装 这是我第一次 ...

  6. vue替换全部符合’字符串_技术成长日记-Vim实用技巧-4.7查找替换

    1. 普通查找 / 向下查找 ? 向上查找 n 查找下一个目标字符串 N 查找上一个目标字符串 q/ 回溯查找历史,输入该命令后会在状态栏上方显示一个查找历史回溯窗口,如图4.1: 图4.1 回溯查找 ...

  7. puppet成长日记二 Package资源详细介绍及案例分析

    puppet成长日记二 Package资源详细介绍及案例分析 一.系统环境 1.puppet服务端 Release:RHEL6.4 HOSTNAME: puppetserver.rsyslog.org ...

  8. 网络工程师成长日记382-西部数据Juniper网络设备调试

    网络工程师成长日记382-西部数据Juniper网络设备调试 这是我的第382篇原创文章,记录网络工程师行业的点点滴滴,结交IT行业有缘之人 西部数据Juniper网络设备调试 早上九点怀着无比激动的 ...

  9. 运维小白的成长日记第四天-基础网络构建OSI七层模型-物理层基础知识

    运维小白的成长日记第四天- 基础网络构建OSI七层模型-物理层基础知识 网络运维的小白和想要加入网络运维的小伙伴们值得一看哦~ 今天是初识网络运维的第四天.希望能有志同道合的小伙伴一起讨论和学习,也希 ...

最新文章

  1. javascript 利用 - 枚举思想 - 添加地名的一个小例子
  2. vs2015 行数统计
  3. 计算机网络(十),HTTP的关键问题
  4. hdu 2586 How far away ?(LCA模板)(倍增法)
  5. java 存储变量_如何在Java 8中将方法存储在变量中?
  6. sparkstreaming消费receive
  7. vulkan android 三星,vulkan android
  8. Android之在不同的Activity之间传递数据
  9. 记录10本关于开关电源的书
  10. 计算机 标量,标量关系
  11. 迷之Konigsberg七桥问题
  12. 计算机硬盘大小转换(B,KB,MB,GB,TB,PB之间的大小转换)
  13. 实时计算 Flink SQL 核心功能解密
  14. pytorch股票预测
  15. python作业_python小作业
  16. 城市级智能网联示范区情况全扫描(2021版)
  17. MicroBlaze系列教程(1):AXI_GPIO的使用
  18. android 输入法悬浮,专为大屏手机设计,谷歌Gboard输入法新增悬浮键盘功能
  19. UI设计存在什么意义?
  20. Paper reading (二十一):Human gut microbiome: hopes, threats and promises

热门文章

  1. html 画圆点代码,HTML5 Canvas绘制圆点虚线实例
  2. 百度站长工具-网站改版使用说明
  3. 最新防病毒软件排名:PC-cillin 拦截率第一名
  4. 股权常识:32套学习股权设计方案
  5. 2007九寨黄龙游[风景篇]
  6. IDEA翻译插件(Translation)不能用啦?
  7. DevOps模式下测试左移和测试右移
  8. 【mahout笔记】初步理解itemCF(基于物品的推荐算法)在mahout的实现
  9. 合同word快速开发成html格式
  10. mac爱奇艺下载的视频在哪里