从零开始的C++学习(14)
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;}
封装意义二:
类在设计时,可以把属性和行为放在不同的权限下,加以控制
访问权限有三种:
public 公共权限
protected 保护权限
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)相关推荐
- 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(四)
前情提要: 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(一) 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(二) 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(三) 文章目录 0. ...
- 从零开始的Linux学习日志(3)
从零开始的Linux学习日志(3) vim文本编辑器 1.vim文本编辑器的三种模式 2.命令模式的常用命令 3.末行模式的常用命令 4.vim使用实例--配置主机名称 5.vim使用实例--配置网卡 ...
- 从零开始的深度学习(一) 经典CNN网络 LeNet-5
从零开始的深度学习(一) 经典CNN网络 LeNet-5 之前的四篇博客围绕着一个大作业项目来进行的入门,由于小白初涉,因此行文中有时侧重于某些并不重要的东西,同时也忽略了许多其实蛮重要的东西,再加上 ...
- Java学习-14 CSS与CSS3美化页面及网页布局
Java学习-14 CSS与CSS3美化页面及网页布局 1. CSS简介 什么是CSS? CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示控制 HTML 元素, ...
- 从零开始的Linux学习日志(4)
从零开始的Linux学习日志(4) 用户身份与能力 1.UID 2.GID和Groups 3.添加新用户useradd 4.添加新的用户组groupadd 5.修改用户属性usermod 6.修改用户 ...
- 从零开始的Linux学习日志
从零开始的Linux学习日志 从零开始的Linux学习生活 搭建环境 常见的Linux指令 1. echo 2.date 3.reboot和poweroff 4.其他重要指令 小结 从零开始的Linu ...
- linspace函数matlab_从零开始的matlab学习笔记——(29)泰勒逼近函数
matlab应用--求极限,求导,求积分,解方程,概率统计,函数绘图,三维图像,拟合函数,动态图....更多内容尽在个人专栏:matlab学习 上一节我们成功制作了能自己转圈的三维螺旋线,这里我们再来 ...
- matlab数组平方的计算自定义函数_从零开始的matlab学习笔记——(38)简单数论计算函数:取整,gcd,lcm,质数,全排列...
matlab应用--求极限,求导,求积分,解方程,概率统计,函数绘图,三维图像,拟合函数,动态图,傅里叶变换,随机数,优化问题....更多内容尽在个人专栏:matlab学习 翻了翻优化工具箱,发现内容 ...
- 从零开始编写深度学习库(四)Eigen::Tensor学习使用及代码重构
从零开始编写深度学习库(四)Eigen::Tensor学习使用及代码重构 博客:http://blog.csdn.net/hjimce 微博:黄锦池-hjimce qq:1393852684 一. ...
- 从零开始编写深度学习库(三)ActivationLayer网络层CPU实现
从零开始编写深度学习库(三)ActivationLayer网络层CPU实现 博客:http://blog.csdn.net/hjimce 微博:黄锦池-hjimce qq:1393852684 一 ...
最新文章
- .中英文系统底层编码导致乱码问题
- 模板:SharePoint2007解决方案包
- 收官礼 |《神策 2018 数据驱动大会回顾专刊》发布,你要的干货,已打包!
- PW Live直播 | 清华大学NLP组刘正皓:神经信息检索的进展与挑战
- c# 中重载WndProc,实现重写“最小化”自定义功能的方法
- linux python3运行,将Python3安装到Linux上并运行
- ImageView缩放选项
- java如何解析word大纲_java解析word文件
- 那年学过的Oracle笔记
- 保存文件 安卓_手机怎么解压zip文件 安卓手机zip文件怎么打开?
- 论文《Reasoning With Neural Tensor Networks for Knowledge Base Completion》的学习笔记
- C语言的一些基础语法
- 清华大学2001年机试-字符串排序-1066
- Android10/11 原生Launcher3深度定制开发
- 工作站就是高级的微型计算机,家用pc机和工作站有什么不同?
- 移动咪咕PHP代理源码,咪咕视频解析源码
- 中文字符集与字符编码知识
- 镜像和分光采集的网卡接入方法
- AIX操作系统维护详解
- 为什么说华为Petal One不只是数字会员组合服务