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

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

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. PHP带参数传值调用python脚本

    PHP主要用在服务器端做网站后台开发,有些功能用PHP来实现有点费劲或者无法实现,现在在学习python,同样是脚本语言,感觉python能做的事情PHP不一定能胜任.但是现在大部分的网站后台也是用P ...

  2. C#多线程处理

    创建多线程,并带参数! using System; using System.Collections; using System.Collections.Generic; using System.I ...

  3. 深入web的请求过程

    一.深入web的请求过程 1.1.B/S网络架构概述 · 从前端到后端,都基于应用层协议HTTP来交互数据.一个请求就对应了一个操作,完成操作之后就断开了连接.基于这样的特点可以用来满足海量的用户的操 ...

  4. linux下安装svn1.7

    转自 https://blog.csdn.net/u011752559/article/details/11559573?locationNum=11&fps=1 1.下载svn安装包 wge ...

  5. 第十二节,OpenCV学习(一)图像的读取、显示、保存

    一.读取图像 所谓的图像就是一个数组,对图像的处理就是对数字的处理 import cv2 import numpy as np img = cv2.imread('dog.jpg') print(im ...

  6. 示波器X1探头和X10探头

    示波器探头有X1和X10档,当测量一个信号时应该如何选择? 1.先我们看它们的区别? X1档,表示信号没有经过衰减进入示波器 X10档,表示信号衰减10倍进入示波器(当示波器也设置为X10档,直接读数 ...

  7. (转)前端开发-发布一个NPM包之最简单易懂流程

    原文地址:https://www.cnblogs.com/sghy/p/6829747.html 1.npm官网创建npm账户 npm网站地址:https://www.npmjs.com/ npm网站 ...

  8. postgre 常用语法,如 group_concat用法

    1.查询postgre的表所有字段列 select table_name, column_name from information_schema.columns where table_schema ...

  9. ***新版微信H5支付技术总结(原创)

    新版微信H5支付官方文档: https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1 H5支付是指商户在微信客户端外 ...

  10. kettle基础概念的学习

    参考书籍:Pentaho Kettle Solutions中文版.由于最近不断的使用kettle,随着不断深入使用,遇到的问题越来越多,发现脑子那点货根本不够用,所以根据阅读把一些概念记录一下,方便自 ...