继承既然已经知道了是什么意思了,下面我们来学封装!

什么是封装?我们来举个例子:

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++类第五课:类的使用(三)[个人见解]的更多相关文章

  1. Python学习第十五课——类的基本思想(实例化对象,类对象)

    类的基本思想 类:把一类事物的相同的特征和动作整合到一起就是类类是一个抽象的概念 对象:就是基于类而创建的一个具体的事物(具体存在的)也是特征和动作整合到一块 对象写法 # 对象写法 def scho ...

  2. UML类图五种关系与代码的对应关系

    转: UML类图中的五种关系的耦合强弱比较:依赖<关联<聚合<组合<继承 一.依赖关系: (一)说明 虚线+箭头 可描述为:Uses a 依赖是类的五种关系中耦合最小的一种关系 ...

  3. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  4. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  5. c++ 吕凤翥 第五章 类对象一

    一   类的声明和实现 1. class tdate   //声明部分 { public: void setdate(int y,int m,int d); int isleapyear(); voi ...

  6. Java基础复习笔记系列 五 常用类

    Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...

  7. C#基础(五)——类中私有构造函数作用

    如果类成员有private修饰符,就不允许在类范围以外访问这个类成员.对类构造函数应用private修饰符时,则禁止外部类创建该类的实例.尽管看上去有些不好理解(既然不能实例化,那么这个类还有什么用处 ...

  8. 快学Scala-第五章 类

    知识点: 1.简单类和无参方法 class Counter { private var value = 0 //必须初始化字段 def increment() { value += 1} //方法默认 ...

  9. JAVA基础复习与总结<五> String类_File类_Date类

    String类 .Java字符串就是Unicode字符序列,例如串“Java”就是4个Unicoe字符组成. .Java没有内置的字符串类型,而是在标准java类库中提供了一个预定义的类String, ...

随机推荐

  1. java构造方法的重载

    package test; public class Person { String name; int age; public Person() { System.out.println(" ...

  2. NPOI读取excel表,如果有公式取出的是公式,想要取数字怎么办?

    public static DataTable Import(string strFileName) { DataTable dt = new DataTable(); HSSFWorkbook hs ...

  3. windows上安装zip版mongodb

    版本3.4:现将mongodb解压,再选择一个位置创建data文件夹并在其下创建db文件夹和log文件夹 然后编写mongod.cfg文件,注意这里用的yaml格式,对空格很敏感,并且要注意mongo ...

  4. JavaScript—offset、client、scroll

    offsetTop,offsetLeft:获取离最近父容器的位置,如果没有父容器,那么获取离body最近的位置 offsetWidth,offsetHeight:获取元素的大小,包括padding,b ...

  5. Moment.js简单使用

    1.设置语言环境,如设置中文环境: moment.locale("zh-cn"); 2.当前时间.指定时间: // 假设当前时间为:2018年12月10日 moment(); // ...

  6. 论文笔记:Fast(er) RCNN

    在 RCNN 初步试水取得成功后,研究人员又迅速跟进,针对 RCNN 中的几点不足提出改进,接连推出了 fast-rcnn 和 faster-rcnn.关于这两篇论文,网上相关的文章实在是多如牛毛,因 ...

  7. [Kubernetes]资源模型与资源管理

    作为 Kubernetes 的资源管理与调度部分的基础,需要从它的资源模型说起. 资源管理模型的设计 我们知道,在 Kubernetes 里面, Pod 是最小的原子调度单位,这就意味着,所有和调度和 ...

  8. sublime text3输出窗口中文显示乱码问题解决方案

    1 前言 略 2 方案 修改Python3.sublime-build内容为 { "cmd": ["C:/Users/Administrator/AppData/Loca ...

  9. [其它]iOS 12.2支持电信VoLTE了,中国电信教你如何开通:只要三步

    iOS 12.2支持电信VoLTE了,中国电信教你如何开通:只要三步 link :https://baijiahao.baidu.com/s?id=1629039609897267682&wf ...

  10. docker简单介绍---部署私有docker仓库Registry

    1. 关于Registry 官方的Docker hub是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去.但是,有时候,我们的使用场景需要我们拥有一个私有 ...