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

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

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. react 中使用阿里彩色图标

    1. 不光要引入css ,还要引入js 2. 在需要引入icon的地方添加 <svg className={styles.menuIcon} aria-hidden="true&quo ...

  2. windows powershell上批量修改文件名称

    $i = Get-ChildItem -Path c:\pictures -Filter *.jpg | ForEach-Object { $extension = $_.Extension $new ...

  3. 2018-2019-2 20165234 《网络对抗技术》 Exp3 免杀原理与实践

    实验三 免杀原理与实践 实验内容 1.正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧:(1.5分) 2.通过 ...

  4. iOS 集成百度地图 位置偏移问题

    iOS 集成百度SDK 请参考 百度地图官方文档 ,这里不就多啰嗦了 本文介绍的是在百度地图上根据经纬度,自定义气泡时,气泡位置的偏移,在我们天朝这种事是很常见的,也见怪不怪了,在项目中使用的百度地图 ...

  5. 借助 LVS + Keepalived 实现负载均衡

    虽然现在云手段很高明了.但是这个lvs + keepalive 还是需要了解下的. 今天就整理了下lvs和keepalive的东西.做下总结留作以后怀念 在实际应用中,在Web服务器集群之前总会有一台 ...

  6. TCP-IP详解笔记8

    TCP-IP详解笔记8 TCP超时与重传 下层网络层(IP)可能出现丢失, 重复或丢失包的情况, TCP协议提供了可靠的数据传输服务. TCP启动重传操作, 重传尚未确定的数据. 基于时间重传. 基于 ...

  7. 《ASCE1885的信息安全》のCryptoAPI---密钥的产生和交换函数

    在公开密码算法的前提下,数据的安全取决于密钥.因此,密钥的产生.销毁.交换(分发)是数据保密工作中的重要部分. CryptoAPI密钥产生和交换函数主要有生成密钥函数CryptGenKey.派生密钥函 ...

  8. Oracle XMLTYPE数据类型创建及插入

    --1.创建xml表Create TABLE testxml2(id NUMBER,data XMLTYPE); --2.插入数据--1)创建目录 CREATE or replace DIRECTOR ...

  9. JAVA 三元运算符 求最大值

    package Code428; import java.util.Scanner; public class CodeScannerMax { public static void main(Str ...

  10. Centos 7部署docker

    master安装: 安装zookeeper -openjdk java--openjdk-headless rpm -i packages/mesosphere-zookeeper--.centos7 ...