4 类和对象

C++面向对象的三大特性为:封装继承多态

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

例如

人可以作为对象,属性有姓名、年龄、身高、体重…行为有走、跑、跳、吃饭……

车可以作为对象,属性有轮胎、车灯、牌照、颜色…行为有载人、放音乐、倒车……

具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类

4.1 封装

4.1.1 封装的意义

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

封装的意义:

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

  • 将属性和行为加以权限控制

封装的意义一

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

语法

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

计算圆的周长

#include <iostream>
using namespace std;//设计一个圆类,求圆的周长
//周长公式:2*PI*半径//圆周率
const double PI = 3.14;//class 代表设计一个类,类后面紧跟着类的名称
class Circle
{//访问权限//公共权限
public://属性int R;//行为//获取圆的周长double calculateZC(){return 2 * PI * R;}
};int main()
{//通过圆类 创建具体的源(对象)//实例化 (通过一个类 创建一个对象的过程)Circle c1;//给圆对象的属性进行赋值c1.R = 10;cout << "圆都周长为:" << c1.calculateZC() << endl;system("pause");return 0;}

设计一个学生类,属性:姓名、学号,行为:显示姓名、显示学号

#include <iostream>
using namespace std;//学生类
//类中的属性和行为 统一称为 成员
//属性 成员函数 成员变量
//行为 成员函数 成员方法
class student
{
public://属性string Sname;string Snum;// 行为void showInfo() {cout << "姓名为:" << Sname << endl;cout << "学号为:" << Snum << endl;}//给姓名赋值void setName(string name){Sname = name;}void setNum(string num){Snum = num;}};int main()
{//实例化对象student stu;//给stu对象 进行属性赋值//stu.Sname = "张三";//stu.Snum = "2145211123";stu.setName("张三");stu.setNum("2145211123");stu.showInfo();system("pause");return 0;}

封装意义二

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

访问权限有三种:

  1. public    ​公共权限

  2. protected 保护权限

  3. private 私有权限

#include <iostream>
using namespace std;//访问权限
//三种
//公共权限 public     成员 类内可以访问 类外可以访问
//保护权限 protected  成员 类内可以访问 类外不能访问 子类可以访问父类保护内容
//私有权限 private    成员 类内可以访问 类外不能访问 子类不能访问父类私有内容class Person
{
public://公共权限string Name;//姓名protected://保护权限string Car;//汽车private://私有权限string Password;//密码public:void func(){Name = "张三";Car = "BWM";Password = "123456";}
};int main()
{//实例化Person p1;p1.Name = "李四";//p1.Car = "ben";//保护权限内容在类外是访问不到的//p1.Password = "212121";//私有权限内容,类外也是访问不到的system("pause");return 0;}

4.1.2 struct和class的区别

在C++中struct和class唯一的区别就在于默认的访问权限不同

区别

  • struct默认权限为公共

  • class默认权限为私有

#include <iostream>
using namespace std;class c1
{int C_a;//默认权限 私有
};struct c2
{int C_b;//默认权限 共有
};int main()
{c1 c_1;//c_1.C_a = 100;//报错 私有 类外不可访问c2 c_2;c_2.C_b = 100;//正确 共有 类外可以访问system("pause");return 0;}

4.1.3 成员属性设置为私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限

优点2:对于写权限,我们可以检测数据的有效性

#include <iostream>
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){m_Age = 0;cout << "输入年龄有误!" << endl;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("李四");p.setAge(10);cout << "年龄为:" << p.getAge() << endl;p.setAge(1000);cout << "年龄为:" << p.getAge() << endl;system("pause");return 0;}

案例

要求:设计立方体类(Cube)

求出立方体的面积和体积

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

#include <iostream>
using namespace std;//立方体类
//属性 长宽高
//行为 获取面积 获取体积
//分别用全局函数和成员函数 判断 两个立方体是否相等
class Cube
{//属性 一般都是私有
private:int m_L;//长int m_W;//宽int m_H;//高//行为 一般使用public接口
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_L * m_W + 2 * m_H * m_W + 2 * m_L * m_H;}//获取体积int calculateV(){return m_H * m_L * m_W;}//利用成员函数比较是否相等bool isSameByClass(Cube &c) {if (m_H == c.getH() && m_L == c.getL() && m_W == c.getW()) {return true;}return false;}};//利用全局函数判断 两个立方体是否相等
bool isSame(Cube &c1,Cube &c2)
{if (c1.getH() == c2.getH() && c1.getL() == c2.getL() && c1.getW() == c2.getW()) {return true;}return false;
}int main()
{Cube c1;c1.setL(10);c1.setW(10);c1.setH(10);cout << "面积为:" << c1.calculateS() << endl;cout << "体积为:" << c1.calculateV() << endl;Cube c2;c2.setL(10);c2.setW(42);c2.setH(10);cout << "面积为:" << c2.calculateS() << endl;cout << "体积为:" << c2.calculateV() << endl;//利用全局函数判断bool ret1 = isSame(c1, c2);if (ret1) {cout << "全局函数判断:两个立方体相等" << endl;}else{cout << "全局函数判断:两个立方体不相等" << endl;}//利用成员函数判断bool ret2 = c1.isSameByClass(c2);if (ret2){cout << "成员函数判断:两个立方体相等" << endl;}else{cout << "成员函数判断:两个立方体不相等" << endl;}system("pause");return 0;}

案例

设计一个圆类(Circle),和一个点类(Point),计算点和圆的关系

#include <iostream>
using namespace std;class Point
{//属性
private:int m_X;int m_Y;//行为
public://设置Xvoid setX(int x) { m_X = x; }//设置Yvoid setY(int y) { m_Y = y; }//获取Xint getX() { return m_X; }//获取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(9);//判断关系isInCircle(c, p);system("pause");return 0;
}

修改代码格式,使代码更改清晰

Cricle.h

#pragma once
#include <iostream>
#include "Point.h"
using namespace std;class Circle
{//属性
private:int m_R;//半径//在类中可以让另一个类作为本类中的成员Point m_center;//圆心//行为
public://设置半径void setR(int r);//获取半径int getR();//设置圆心void setCenter(Point center);//获取圆心Point getCenter();
};

Cricle.cpp

#include <iostream>
#include "Circle.h"
using namespace std;//设置半径void Circle::setR(int r) { m_R = r; }//获取半径int Circle::getR() { return m_R; }//设置圆心void Circle::setCenter(Point center) { m_center = center; }//获取圆心Point Circle::getCenter() { return m_center; }

Point.h

#pragma once
#include <iostream>
using namespace std;
class Point
{//属性
private:int m_X;int m_Y;//行为
public://设置Xvoid setX(int x);//设置Yvoid setY(int y);//获取Xint getX();//获取Yint getY();
};

Point.cpp

#include <iostream>
#include "Point.h"
using namespace std;//行为//设置Xvoid Point::setX(int x) { m_X = x; }//设置Yvoid Point::setY(int y) { m_Y = y; }//获取Xint Point::getX() { return m_X; }//获取Yint Point::getY() { return m_Y; }

main.cpp

#include <iostream>
#include "Circle.h"
#include "Point.h"
using namespace std;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(9);//判断关系isInCircle(c, p);system("pause");return 0;
}

从零开始的C++学习(14)相关推荐

  1. 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(四)

    前情提要: 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(一) 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(二) 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(三) 文章目录 0. ...

  2. 从零开始的Linux学习日志(3)

    从零开始的Linux学习日志(3) vim文本编辑器 1.vim文本编辑器的三种模式 2.命令模式的常用命令 3.末行模式的常用命令 4.vim使用实例--配置主机名称 5.vim使用实例--配置网卡 ...

  3. 从零开始的深度学习(一) 经典CNN网络 LeNet-5

    从零开始的深度学习(一) 经典CNN网络 LeNet-5 之前的四篇博客围绕着一个大作业项目来进行的入门,由于小白初涉,因此行文中有时侧重于某些并不重要的东西,同时也忽略了许多其实蛮重要的东西,再加上 ...

  4. Java学习-14 CSS与CSS3美化页面及网页布局

    Java学习-14 CSS与CSS3美化页面及网页布局 1. CSS简介 什么是CSS? CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示控制 HTML 元素, ...

  5. 从零开始的Linux学习日志(4)

    从零开始的Linux学习日志(4) 用户身份与能力 1.UID 2.GID和Groups 3.添加新用户useradd 4.添加新的用户组groupadd 5.修改用户属性usermod 6.修改用户 ...

  6. 从零开始的Linux学习日志

    从零开始的Linux学习日志 从零开始的Linux学习生活 搭建环境 常见的Linux指令 1. echo 2.date 3.reboot和poweroff 4.其他重要指令 小结 从零开始的Linu ...

  7. linspace函数matlab_从零开始的matlab学习笔记——(29)泰勒逼近函数

    matlab应用--求极限,求导,求积分,解方程,概率统计,函数绘图,三维图像,拟合函数,动态图....更多内容尽在个人专栏:matlab学习 上一节我们成功制作了能自己转圈的三维螺旋线,这里我们再来 ...

  8. matlab数组平方的计算自定义函数_从零开始的matlab学习笔记——(38)简单数论计算函数:取整,gcd,lcm,质数,全排列...

    matlab应用--求极限,求导,求积分,解方程,概率统计,函数绘图,三维图像,拟合函数,动态图,傅里叶变换,随机数,优化问题....更多内容尽在个人专栏:matlab学习 翻了翻优化工具箱,发现内容 ...

  9. 从零开始编写深度学习库(四)Eigen::Tensor学习使用及代码重构

    从零开始编写深度学习库(四)Eigen::Tensor学习使用及代码重构 博客:http://blog.csdn.net/hjimce 微博:黄锦池-hjimce   qq:1393852684 一. ...

  10. 从零开始编写深度学习库(三)ActivationLayer网络层CPU实现

    从零开始编写深度学习库(三)ActivationLayer网络层CPU实现 博客:http://blog.csdn.net/hjimce 微博:黄锦池-hjimce   qq:1393852684 一 ...

最新文章

  1. .中英文系统底层编码导致乱码问题
  2. 模板:SharePoint2007解决方案包
  3. 收官礼 |《神策 2018 数据驱动大会回顾专刊》发布,你要的干货,已打包!
  4. PW Live直播 | 清华大学NLP组刘正皓:神经信息检索的进展与挑战
  5. c# 中重载WndProc,实现重写“最小化”自定义功能的方法
  6. linux python3运行,将Python3安装到Linux上并运行
  7. ImageView缩放选项
  8. java如何解析word大纲_java解析word文件
  9. 那年学过的Oracle笔记
  10. 保存文件 安卓_手机怎么解压zip文件 安卓手机zip文件怎么打开?
  11. 论文《Reasoning With Neural Tensor Networks for Knowledge Base Completion》的学习笔记
  12. C语言的一些基础语法
  13. 清华大学2001年机试-字符串排序-1066
  14. Android10/11 原生Launcher3深度定制开发
  15. 工作站就是高级的微型计算机,家用pc机和工作站有什么不同?
  16. 移动咪咕PHP代理源码,咪咕视频解析源码
  17. 中文字符集与字符编码知识
  18. 镜像和分光采集的网卡接入方法
  19. AIX操作系统维护详解
  20. 为什么说华为Petal One不只是数字会员组合服务

热门文章

  1. 郑清 - 日常作息表(2020-03)
  2. 万字长文分享,新手小白如何自学Java(方法+步骤)
  3. 如何提高棋牌游戏玩家的流量
  4. Codeforces Round #579 (Div. 3)--Boxers(贪心,排序)
  5. 忘记drupal7的管理员密码的恢复方法
  6. xbox 0x_Xbox Series X之路
  7. 霖呆呆的中大厂面试记录及2年前端薪资对比(附赠学习方法)
  8. Ultraedit 26.0安装教程
  9. SRE(运维)就要努力做到最好
  10. 我想带你去浪漫的土耳其