C++类第五课:类的使用(三)[个人见解]
继承既然已经知道了是什么意思了,下面我们来学封装!
什么是封装?我们来举个例子:
1、你不能随意挥霍父母的血汗钱,血汗钱是作为他们的私有财产,而父母因为某些原因会主动给你,你才能用的舒心,否则父母不会给你用,你也用不到。
能看出什么?对于私有财产,需要一个正当的理由来包装你要用到财产的举动,你才能获取。
在这里呢,我们就可以把它作为封装。
用形象点的话语解释:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
下面用代码看看封装的实现到底是个什么玩意?
首先创建两个类:Parent和Child。
Parent.h:
#ifndef __PARENT_H__
#define __PARENT_H__ class Parent
{
public:
Parent();
~ Parent();
public: //公有的成员函数以实现封装
void setCar(char *srccar);
char *getCar()const; void setMoney(float money);
float getMoney()const;
private: //私有的成员变量
char *p_car; //家用车
float p_money; //钱
};
#endif
Parent.cpp:
#define _CRT_SECURE_NO_WARNINGS //用到不是全新标准的函数,一定要加上这句,看报错异常的提示
#include "Parent.h"
#include <cstring>
#include <iostream>
using namespace std;
Parent::Parent()
{
} Parent::~Parent()
{
} //封装p_car
void Parent::setCar(char *srccar)
{
//分配内存空间
this->p_car = (char *)malloc(sizeof(char));
memset(this->p_car,0,sizeof(char));
//判断p_car是否分配成功
if (this->p_car== NULL)
{
cout << "this->p_car分配内存空间失败" << endl;
system("pause");
return;
}
strcpy(this->p_car,srccar); //字符串数据只能用拷贝的函数赋值,不能直接用等号
}
char *Parent::getCar()const
{
return this->p_car;
} //封装p_money
void Parent::setMoney(float money)
{
this->p_money = money;
}
float Parent::getMoney()const
{
return this->p_money;
}
Child.h:
#ifndef __CHILD_H__
#define __CHILD_H__ #include "Parent.h" class Child
:public Parent
{
public:
Child();
~Child();
void getParentCar(Parent &parents);
void getParentMoney(Parent &parents);
private: };
#endif
Child.cpp:
#include "Child.h"
#include <iostream>
using namespace std; Child::Child()
{
} Child::~Child()
{
} //获取父母的车子
void Child::getParentCar(Parent &parents)
{
cout << "你能使用父母的" << parents.getCar() << endl;
} //获取父母的钱
void Child::getParentMoney(Parent &parents)
{
cout << "你能使用父母的" << parents.getMoney() << endl;
}
主体源文件:
#include <iostream>
#include "Parent.h"
#include "Child.h"
using namespace std; int main()
{
Parent parent;
parent.setCar("威龙"); //设置汽车名字
parent.setMoney(100.000000f); //设置金额 Child child;
child.getParentCar(parent);
child.getParentMoney(parent); system("pause");
return 0;
}
运行下看看,写的很对,但很麻烦,如果需要加多个信息,是不是一个个设置呢?这样既耗时也麻烦,不够高逼格。
下面我们来优化下Parent.h文件的代码:
#ifndef __PARENT_H__
#define __PARENT_H__ class Parent
{
public:
Parent(); //无参构造
Parent(char *car,float money); //带参构造
~ Parent();
public: //公有的成员函数以实现封装
char *getCar()const;
float getMoney()const;
private: //私有的成员变量
char *p_car; //家用车
float p_money; //钱
};
#endif
Parent.cpp:
#define _CRT_SECURE_NO_WARNINGS
#include "Parent.h"
#include <cstring>
#include <iostream>
using namespace std;
Parent::Parent()
{
}
Parent::Parent(char *car, float money)
{
//分配内存空间
this->p_car = (char *)malloc(sizeof(char));
memset(this->p_car, 0, sizeof(char));
//判断p_car是否分配成功
if (this->p_car == NULL)
{
cout << "this->p_car分配内存空间失败" << endl;
system("pause");
return;
}
strcpy(this->p_car, car);
this->p_money = money;
} Parent::~Parent()
{
}
char *Parent::getCar()const
{
return this->p_car;
}
float Parent::getMoney()const
{
return this->p_money;
}
主体源文件:
#include <iostream>
#include "Parent.h"
#include "Child.h"
using namespace std; int main()
{
Parent parent("威龙",100.000000f); Child child;
child.getParentCar(parent);
child.getParentMoney(parent); system("pause");
return 0;
}
Parent的四个封装函数与改动后带参构造是等同效果,不信可以运行看看。
提示:你学的不是代码怎么写,而是方式方法,而小编主要说的只是套路方法,不是什么深层次的东西,望对你有用。
无参构造能干嘛?带参构造能干嘛?封装能封装什么?还有别忘了前面学的cstring头文件里的函数。
C++类第五课:类的使用(三)[个人见解]的更多相关文章
- Python学习第十五课——类的基本思想(实例化对象,类对象)
类的基本思想 类:把一类事物的相同的特征和动作整合到一起就是类类是一个抽象的概念 对象:就是基于类而创建的一个具体的事物(具体存在的)也是特征和动作整合到一块 对象写法 # 对象写法 def scho ...
- UML类图五种关系与代码的对应关系
转: UML类图中的五种关系的耦合强弱比较:依赖<关联<聚合<组合<继承 一.依赖关系: (一)说明 虚线+箭头 可描述为:Uses a 依赖是类的五种关系中耦合最小的一种关系 ...
- (转)Qt Model/View 学习笔记 (五)——View 类
Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- c++ 吕凤翥 第五章 类对象一
一 类的声明和实现 1. class tdate //声明部分 { public: void setdate(int y,int m,int d); int isleapyear(); voi ...
- Java基础复习笔记系列 五 常用类
Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...
- C#基础(五)——类中私有构造函数作用
如果类成员有private修饰符,就不允许在类范围以外访问这个类成员.对类构造函数应用private修饰符时,则禁止外部类创建该类的实例.尽管看上去有些不好理解(既然不能实例化,那么这个类还有什么用处 ...
- 快学Scala-第五章 类
知识点: 1.简单类和无参方法 class Counter { private var value = 0 //必须初始化字段 def increment() { value += 1} //方法默认 ...
- JAVA基础复习与总结<五> String类_File类_Date类
String类 .Java字符串就是Unicode字符序列,例如串“Java”就是4个Unicoe字符组成. .Java没有内置的字符串类型,而是在标准java类库中提供了一个预定义的类String, ...
随机推荐
- ASP.NET之页面传值
一.目前在ASP.NET中页面传值共有这么几种方式: 1.使用QueryString变量QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中.如果是传递一个或多个安全 ...
- KAGGLE竟赛
KAGGLE竟赛 关于kaggle的竟赛规则我们勇闯组做出了一些说明,大家可以借鉴一下如何参加kaggle,参加kaggle大赛的一些注意事项,自己参加一些项目,一定会使你的知识量得到质的提升 这是链 ...
- vue生命周期的理解
我从官网上下载了一张vue生命周期的图,接下来实际分析一波vue到底执行了什么东西. 1.我们在使用vue时必不可少的操作就是 var vm = new Vue({}),这样我们就创建了一个vue的实 ...
- Linux基础 - 基本命令
一.Linux系统命令操作语法格式 二.目录操作 创建目录 查看目录 改变当前的目录/位置 打印当前工作目录 三.创建文件或者修改文件时间戳(文件属性) 四.stat命令 vim 查看文件内容 mor ...
- MSSQL的简单盲注
方式一:遍历ascii码的方式 一.判断数据库类型 and (select count(*) from sysobjects)>0 二.获取数据库 and ascii(substring((se ...
- 20165221 《网络对抗技术》EXP2:后门原理与实践
20165221 <网络对抗技术>EXP2:后门原理与实践 实验任务 任务一:使用netcat获取主机操作Shell,cron启动 (0.5分) 任务二:使用socat获取主机操作Shel ...
- redis集群结构图
在JAVA编程时,使用哨兵池获取jedis来进行数据的操作,哨兵对对集群进行监视,当主节点宕掉时,会自动将子一个子节点升级为主节点,原来的主节点上线时会自动变为从节点,主节点的变化,对于使用哨兵池方式 ...
- C# 常用类型校验Validate
using System.Text; using System.Text.RegularExpressions; namespace 落地页测试代码 { public class Validate { ...
- JS 冷知识,运行机制
数组取最小.最大值 var a=[1,2,3,5]; alert(Math.max.apply(null, a));//最大值 alert(Math.min.apply(null, a));//最小值 ...
- day20包
https://www.cnblogs.com/Eva-J/articles/7292109.html 一.模块: 1.什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名 ...