C++--第8课 - 类中的封装
第8课 - 类中的封装
1. 类的组成
类的实现细节;
类的使用方式。
当使用类时,不需要关心其实现细节;当创建一个类时,才需要考虑其内部实现细节。
例:
使用手机时,只需要知道如何发短信,打电话,拍照等等即可,不需要关心手机是如何开发出来的。
手机开发工程师就需要考虑手机内部的实现细节,如硬件细节和软件细节。
2. 封装的基本概念
根据日常生活中的经验:并不是类的每个属性都是对外公开的。
如:女孩子不希望外人知道自己的年龄和身高。
如:一些男孩子不希望别人知道自己会尿床。
而一些类的属性是对外公开的。
如:人类的姓名,学历,国籍等。
因此,需要在类的表示法中定义属性和行为的公开级别。
类似文件系统中文件的权限。
3. C++中的类的封装
成员变量:C++中用于表示类属性的变量。
成员函数:C++中用于表示类行为的函数。
在C++中可以给成员变量和成员函数定义访问级别。
public:成员变量和成员函数可以在类的内部和外界访问和调用。
private:成员变量和成员函数只能在类的内部被访问和调用。
程序:类成员的访问属性
#include <stdio.h>
struct Biology
{
bool living;
};
struct Animal : Biology
{
bool movable;
void findFood()
{
}
};
struct Plant : Biology
{
bool growable;
};
struct Beast : Animal
{
void sleep()
{
}
};
struct Human : Animal
{
void sleep()
{
printf("I'm sleeping...\n");
}
void work()
{
printf("I'm working...\n");
}
};
struct Girl : Human
{
private:
int age;
public:
void play()
{
printf("I'm girl, I'm playing...\n");
}
void print()
{
age = 22;
printf("Girl's age is %d\n", age);
play();
sleep();
work();
}
};
struct Boy : Human
{
public:
int age;
void play()
{
printf("I'm boy, I'm playing...\n");
}
void print()
{
age = 23;
printf("Boy's age is %d\n", age);
play();
sleep();
work();
}
};
int main(int argc, char *argv[])
{
Girl girl;
//girl.age = 25;
girl.print();
Boy boy;
boy.print();
printf("Press any key to continue...");
getchar();
return 0;
}
4. 类成员的作用域
类成员的作用域都只在类的内部,外部无法直接访问,成员函数可以直接访问成员变量和调用其它成员函数。
类的外部可以通过类变量访问public成员,类成员的作用域与访问级别没有关系。
C++中用struct定义的类的所有成员默认为public。
程序:类成员的作用域
#include <stdio.h>
int i = 1;
struct Test
{
private:
int i;
public:
int j;
int getI()
{
i = 3;
return i;
}
};
int main()
{
int i = 2;
Test test;
test.j = 4;
printf("i = %d\n", i);
printf("::i = %d\n", ::i);
//printf("test.i = %d\n", test.i);
printf("test.j = %d\n", test.j);
printf("test.getI() = %d\n", test.getI());
printf("Press any key to continue...");
getchar();
return 0;
}
2,1,4,3
5. 类的真正形态
struct在C语言中已经有了自己的含义,只能继续兼容。在C++中提供了新的关键字class用于类定义。class和struct的用法是完全相同的。
在用struct定义类时,所有成员的默认属性为public。
在用class定义类时,所有成员的默认属性为private。
#include <stdio.h>
struct A
{
int i;
int getI()
{
return i;
}
};
class B
{
int i;
int getI()
{
return i;
}
};
int main(int argc, char *argv[])
{
A a;
B b;
a.i = 1;
a.getI();
b.i = 2;
b.getI();
printf("Press any key to continue...");
getchar();
return 0;
}
运行的时候,struct A中的内容可以访问,class B中的内容无法访问。
6. 手把手写代码
要求:
提供setOperator函数设置运算类型,如:加,减,乘,除。
提供setParameter函数设置运算参数,类型为整型。
提供result函数进行运算,其返回值表示运算的合法性,通过引用参数返回结果。
7. 运算类的改进
在Operator中所有成员函数的实现都在类中完成。
问题:对于使main函数来说,只需要知道怎么使用Operator即可,没有必要知道其实现。
解决方案:将Operator类的实现和定义分开。
operator.h头文件中只有类的声明。
operator.cpp中完成类的其它实现。
operator.h
#ifndef _OPERATOT_H_
#define _OPERATOT_H_
class Operator
{
private:
char mop;
double mP1;
double mP2;
public:
bool setOperator(char op); //boolÀàÐÍ×öºÏ·¨ÅжÏ
void setParameter(double p1, double p2);
bool result(double& r);
};
#endif
operator.cpp
#include "operator.h"
bool Operator::setOperator(char op) //boolÀàÐÍ×öºÏ·¨ÅжÏ
{
bool ret = false;
if((op == '+') || (op == '-') || (op == '*') || (op == '/'))
{
ret = true;
mop = op;
}
return ret;
}
void Operator::setParameter(double p1, double p2)
{
mP1 = p1;
mP2 = p2;
}
bool Operator::result(double& r)
{
bool ret = true;
switch(mop)
{
case '/':
if((-0.0000001 < mP2) && (mP2 < 0.0000001))
{
ret = false;
}
else
{
r = mP1 /mP2;
}
break;
case '+':
r = mP1 + mP2;
break;
case '*':
r = mP1 * mP2;
break;
case '-':
r = mP1 - mP2;
break;
default:
ret = false;
break;
}
return ret;
}
main.cpp
#include<stdio.h>
#include"Operator.h"
int main(int argc, char *argv[])
{
Operator op;
double r = 0;
op.setOperator('+');
op.setParameter(8,2);
if( op.result(r) )
{
printf("Result is %f\n",r);
}
getchar();
return 0;
}
小结:
类的精华在于封装:将实现细节和使用方式相分离。
C++中通过public和private实现类的封装:public成员可以通过变量被外界访问,private成员只能够在类内部使用。
类的定义和实现可以分开到不同的文件中。
转载于:https://www.cnblogs.com/free-1122/p/11336183.html
C++--第8课 - 类中的封装相关推荐
- java类的封装_Java类中的封装
1.Java类中的封装 学习了访问权限修饰符后,应该可以理解封装性的概念和含义.封装性是面向对象三大特征之一 封装性是一种信息隐藏技术 2.封装的概念 在面向对象程式设计方法中,封装(英语:Encap ...
- C++类中的封装-9
一.类通常分为以下两个部分 1.类的实现细节 2.类的使用方式 二.C++中类的封装 1.成员变量 c++中用于表示类属性的变量 2.成员函数 c++中用于表示类的行为的函数 3.在C++中可以给成员 ...
- 关于对发送HTTP请求以及解析服务器返回的数据操作的提取到一个公共类中进行封装
创建一个名为HttpUtil的类并提供名为sendHttpRequest静态方法. 相关代码如下: package com.hzy.networktest; import java.io.Buffer ...
- android封装好的Color类中的常量
通过android封装好的Color类中的常量 public static final int BLACK = 0xFF000000; public static final int DKGRAY = ...
- Mybatis多参数封装到一个类中模糊查询
1.创建QueryValueObject实体类 package com.william.domain;import org.omg.PortableInterceptor.USER_EXCEPTION ...
- java---解析XML文件,通过反射动态将XML内容封装到一个类中
本博客讲的XML解析,使用的是dom4j. 首先建立一个maven项目,在dom.xml中引入相应的dom4j的版本.作者下载的是热度很高的1.6.1版本.maven的使用在这里不做详细讲解. 引入成 ...
- python根据一个基类生成派生类_python中的封装继承多态
1.封装 类的封装可以隐藏类的实现细节,迫使用户只能通过方法去访问数据,这样就可以增强程序的安全性.接下来演示未使用封装可能出现的问题,如例所示. 在例中,运行结果输出的成绩为-68,在程序中不会有任 ...
- Android 获取通讯录联系人,打开通讯录获取联系人信息;整个流程封装在基类中;
打开原生通讯录获取联系人姓名和手机号 1.获取通讯录权限: <!--访问通讯录--><uses-permission android:name="android.permi ...
- Python正则表达式工具类文件的封装实例,提供了多个实例,并且在代码中包含中文注释
Python正则表达式工具类文件的封装实例,提供了多个实例,并且在代码中包含中文注释 import reclass RegexUtils:'''正则表达式工具类'''def __init__(self ...
- 第2章 包装外观(Wrapper Facade):用于在类中封装函数的结构型模式
2.1 介绍 本论文描述包装外观模式.该模式的意图是通过面向对象( OO)类接口来封装低级函数和数据结构.常见的包装外观模式的例子是像 MFC. ACE和 AWT这样的类库,它们封装本地的 OS C ...
最新文章
- 绿盟科技网络安全威胁周报2017.17 请关注Squirrelmail 远程代码执行漏洞CVE-2017-7692...
- elk,logstash -elastcisearch 429
- 魔方机器人需要特制魔方吗_解魔方的机器人攻略18 – 魔方快速算法
- 一文搞懂负载均衡中的一致性哈希算法
- IOS15一个工作空间创建多个项目
- 华为云上可订阅F5_F5亮相华为云计算大会 解读云应用交付
- 台达服务器型号,台达网络服务器机柜 42u 600宽 1200 2000mm SR1160标准机柜
- 《程序员面试宝典》精华 面向对象部分
- 【kafka】kafka 指定分区消费 不会触发 reblance
- android自定义静态广播失效,自定义的静态广播没有作用怎么处理
- Knockout.js 初探
- c语言坐标绕路,C语言中的奇技淫巧
- abcde依次进入一个队列_『并发包入坑指北』之阻塞队列
- html position属性作用,position(五种属性,以及每个属性的特点)
- lora 网关 linux,选择LoRaWAN网关的5大关键 很重要!
- Pr 入门教程如何倾斜移位效果?
- python数学公式编辑工具_GNU TeXmacs
- 腾讯校招智力题-赛马问题-毒药与老鼠
- 服务器dns被劫持如何修复,dns劫持,教您DNS被劫持如何修复
- 单臂路由 二三层交换机、路由器简单组网