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

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

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. QMQTT简单介绍(1)

    1 准备工具: wireshark安装包:网络抓包工具qmqtt源码:mqtt客户端源码(Qt版本)官网:http://mqtt.org/英文版协议说明文档:http://docs.oasis-ope ...

  2. python2编码问题

    前言:python3解决了编码的问题,但python2还存在很多编码问题,用P2写爬虫爬了网页,解析时常有不同字符混着编码,导致解码问题成为爬虫程序员的噩梦... 但咱们要用robot framewo ...

  3. sonar服务搭建

    1.下载安装包,我安装的是6.7.6版本 https://www.sonarqube.org/downloads/ 2.安装前的环境要求 JDK1.8+   数据库,我用的是Mysql5.6版本 3. ...

  4. 吴恩达《机器学习》编程作业——machine-learning-ex1:线性回归

    ❄❄❄❄❄❄❄❄[回到目录]❄❄❄❄❄❄❄❄ 本次编程作业中,需要完成的代码有如下几部分: [⋆] warmUpExercise.m - Simple example function in Octa ...

  5. 【NLP】依存句法关系符号解释

    今天开始读一篇论文:leveraging linguistic structure for open domain information extraction 于是……重新复习了很多句法分析的内容, ...

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

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

  7. SpringJUnit4ClassRunner (单元测试)

    1.在Maven的pom.xml中加入 <dependency> <groupId>junit</groupId> <artifactId>junit& ...

  8. web.xml中DispatcherServlet拦截器的配置详情

    <welcome-file-list>    <welcome-file>index.jsp</welcome-file>    <welcome-file& ...

  9. P2419 [USACO08JAN]牛大赛Cow Contest(dfs走天下/)

    题目描述 FJ的N(1 <= N <= 100)头奶牛们最近参加了场程序设计竞赛:).在赛场上,奶牛们按1..N依次编号.每头奶牛的编程能力不尽相同,并且没有哪两头奶牛的水平不相上下,也就 ...

  10. c编译步骤

    这几天查编译问题时,在头文件中加入某些错误信息,却发现没有编译报错.想了一下可能是,还未进行到语法分析阶段. 这里再了解一下编译过程. 一般而言代码编译包含了四个阶段的处理,即预处理(也称预编译,Pr ...