4 类和对象

C++面向对象的三大特性为:封装、继承、多态

C++认为万事万物都皆为对象,对象上有其属性和行为

例如:

​ 人可以作为对象,属性有姓名、年龄、身高、体重…,行为有走、跑、跳、吃饭、唱歌…

​ 车也可以作为对象,属性有轮胎、方向盘、车灯…,行为有载人、放音乐、放空调…

​ 具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类

4.1 封装

4.1.1 封装的意义

封装是C++面向对象三大特性之一

封装的意义:

  • 将属性和行为作为一个整体,表现生活中的事物
  • 将属性和行为加以权限控制

封装意义一:

​ 在设计类的时候,属性和行为写在一起,表现事物

语法: class 类名{ 访问权限: 属性 / 行为 };

**示例1:**设计一个圆类,求圆的周长

示例代码:

//圆周率
const double PI = 3.14; //1、封装的意义
//将属性和行为作为一个整体,用来表现生活中的事物 //封装一个圆类,求圆的周长
//class代表设计一个类,后面跟着的是类名
class Circle
{
public: //访问权限 公共的权限 //属性
int m_r;//半径 //行为
//获取到圆的周长
double calculateZC()
{
//2 * pi * r
//获取圆的周长
return 2 * PI * m_r;
}
}; int main() { //通过圆类,创建圆的对象
// c1就是一个具体的圆
Circle c1;
c1.m_r = 10; //给圆对象的半径 进行赋值操作 //2 * pi * 10 = = 62.8
cout << "圆的周长为: " << c1.calculateZC() << endl; system("pause"); return 0;
}

**示例2:**设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号

示例2代码:

//学生类
class Student {
public:
void setName(string name) {
m_name = name;
}
void setID(int id) {
m_id = id;
} void showStudent() {
cout << "name:" << m_name << " ID:" << m_id << endl;
}
public:
string m_name;
int m_id;
}; int main() { Student stu;
stu.setName("德玛西亚");
stu.setID(250);
stu.showStudent(); system("pause"); return 0;
}

封装意义二:

类在设计时,可以把属性和行为放在不同的权限下,加以控制

访问权限有三种:

  1. public 公共权限
  2. protected 保护权限
  3. private 私有权限

示例:

//三种权限
//公共权限 public 类内可以访问 类外可以访问
//保护权限 protected 类内可以访问 类外不可以访问
//私有权限 private 类内可以访问 类外不可以访问 class Person
{
//姓名 公共权限
public:
string m_Name; //汽车 保护权限
protected:
string m_Car; //银行卡密码 私有权限
private:
int m_Password; public:
void func()
{
m_Name = "张三";
m_Car = "拖拉机";
m_Password = 123456;
}
}; int main() { Person p;
p.m_Name = "李四";
//p.m_Car = "奔驰"; //保护权限类外访问不到
//p.m_Password = 123; //私有权限类外访问不到 system("pause"); return 0;
}

4.1.2 struct和class区别

在C++中 struct和class唯一的区别就在于 默认的访问权限不同

区别:

  • struct 默认权限为公共
  • class 默认权限为私有
class C1
{
int m_A; //默认是私有权限
}; struct C2
{
int m_A; //默认是公共权限
}; int main() { C1 c1;
c1.m_A = 10; //错误,访问权限是私有 C2 c2;
c2.m_A = 10; //正确,访问权限是公共 system("pause"); return 0;
}

4.1.3 成员属性设置为私有

**优点1:**将所有成员属性设置为私有,可以自己控制读写权限

**优点2:**对于写权限,我们可以检测数据的有效性

示例:

class Person {
public: //姓名设置可读可写
void setName(string name) {
m_Name = name;
}
string getName()
{
return m_Name;
} //获取年龄
int getAge() {
return m_Age;
}
//设置年龄
void setAge(int age) {
if (age < 0 || age > 150) {
cout << "你个老妖精!" << endl;
return;
}
m_Age = age;
} //情人设置为只写
void setLover(string lover) {
m_Lover = lover;
} private:
string m_Name; //可读可写 姓名 int m_Age; //只读 年龄 string m_Lover; //只写 情人
}; int main() { Person p;
//姓名设置
p.setName("张三");
cout << "姓名: " << p.getName() << endl; //年龄设置
p.setAge(50);
cout << "年龄: " << p.getAge() << endl; //情人设置
p.setLover("苍井");
//cout << "情人: " << p.m_Lover << endl; //只写属性,不可以读取 system("pause"); return 0;
}

练习案例1:设计立方体类

设计立方体类(Cube)

求出立方体的面积和体积

分别用全局函数和成员函数判断两个立方体是否相等。

#include<iostream>
using namespace std;
#include<string.h> class Cube{
public:
int setL(int l){
m_L = l;
}
int getL(){
return m_L;
} int setW(int w){
m_W = w;
}
int getW(){
return m_W;
} int setH(int h){
m_H = h;
}
int getH(){
return m_H;
} int clculateS(){
return 2*m_L*m_W + 2*m_W*m_H + 2*m_L*m_H;
} int clculateV(){
return m_H*m_W*m_L;
} bool isSameByClass(Cube &c){
if (m_L == c.getL() && m_W == c.getW()&& m_W == c.getH()){
return true;
}
return false;
} private:
int m_L;
int m_W;
int m_H; }; bool isSame(Cube &c1,Cube &c2){
if (c1.getL() == c2.getL() && c1.getW() == c2.getW()&&c1.getH() == c2.getH()){
return true;
}
return false;
} int main(){ Cube c1;
c1.setL(10);
c1.setH(10);
c1.setW(10);
cout << "area: " << c1.clculateS() << endl;
cout << "volume: " << c1.clculateV() << endl; Cube c2;
c2.setL(10);
c2.setH(20);
c2.setW(10);
bool ret = isSame(c1,c2);
if(ret){
cout << "c1 == c2" <<endl;
}
else
{
cout << "c1 != c2" << endl;
} bool ret1 =c1.isSameByClass(c2);
if(ret1){
cout << "c1 == c2" <<endl;
}
else
{
cout << "c1 != c2" << endl;
}
}

练习案例2:点和圆的关系

设计一个圆形类(Circle),和一个点类(Point),计算点和圆的关系。

#include<iostream>
using namespace std; class Point{
public:
void setX(int x){
m_X = x;
} int getX(){
return m_X;
}
void setY(int y){
m_Y = y;
}
int getY(){
return m_Y;
}
private:
int m_X;
int m_Y;
}; class Circle{
public:
void setR(int r){
m_R = r;
} int getR(){
return m_R;
} void setCenter(Point center){
m_Center = center;
} Point getCenter(){
return m_Center;
} private:
int m_R;
Point m_Center; }; void isInCircle(Circle &c,Point &p){
int distance = (c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) + (c.getCenter().getY() - p.getY())*(c.getCenter().getY() - p.getY());
int rDistance = c.getR() * c.getR();
if (distance == rDistance){
cout << "point == circle" << endl;
}
else if (distance < rDistance){
cout << "point in circle" << endl;
}
else{
cout << "point out circle" << endl;
}
} int main(){
Circle c;
c.setR(10);
Point center;
center.setX(10);
center.setY(0);
c.setCenter(center); Point p;
p.setX(10);
p.setY(9); isInCircle(c,p); } `` **更多信息请关注公众号:**
![img](https://img-blog.csdnimg.cn/2020112110330270.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3llZ2VsaQ==,size_16,color_FFFFFF,t_70#pic_center)

[C++核心编程] 4.1、类和对象-封装的更多相关文章

  1. Python开发基础-Day17面向对象编程介绍、类和对象

    面向对象变成介绍 面向过程编程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西.主要应用在一旦完成很少修改的地方,如linux ...

  2. python基础之面向对象编程介绍、类和对象

    面向对象变成介绍 面向过程编程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西.主要应用在一旦完成很少修改的地方,如linux ...

  3. windows核心编程---第八章 使用内核对象进行线程同步

    使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...

  4. JAVA编程中的类和对象

    1:初学JAVA,都知道JAVA是面向对象的编程.笔者这节开始说说类和对象.(实例仅供参考,如若复制粘贴记得修改包名和类名,避免出错) 学习JAVA的快捷键,Alt+/代码补全功能,其实此快捷键启动了 ...

  5. Java基础--面向对象编程1(类与对象)

    1.类(class)的定义 类是对一组具有相同特征和行为的对象的抽象描述. 在程序中,引入类的概念,就是为了快速生成更多的具有相同特性和行为的事物. 2.对象(object)的定义 对象是类的具体实现 ...

  6. [java核心外篇]__Object类与对象类型的转型

    前言 我们在之前的学习中提过很多次了,java是面向对象的,java的基础可以说是建立在类和对象上面的.然后我们又学到了类的继承,发现了在java类库中,类的继承是极为普遍的,一个类继承另一个类,就像 ...

  7. C#核心基础--浅谈类和对象的概念

    浅谈类和对象的概念 一.什么是类?什么是对象? 学习一门面向对象编程语言,我们必须得知道什么是类?什么是对象? 类(Class)实际上是对某种类型的对象定义变量和方法的原型.它表示对现实生活中一类具有 ...

  8. Java编程里的类和对象

    像我们搞计算机这块的,都知道这么一件事,当前的计算机编程语言主要分为两大块,一为面向过程,二为面向对象.Java就是一门纯面向对象的语言.学习了一个月左右的Java,在下对于Java当中的类和对象有了 ...

  9. C++核心编程 4 类和对象-封装

    C++面向对象的三大特性:封装.继承.多态 C++认为万事万物皆为对象,对象上有其属性和行为 封装 意义:1.将属性和行为作为一个整体,表现生活中的事物 语法: class 类名{   访问权限:属性 ...

  10. 【2】python核心编程 第四章-python对象

    1.python对象 所有的Python 对像都拥有三个特性:身份,类型和值. 身份: 每一个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建函数id()来得到. 这个值可以被认为是该对象的 ...

随机推荐

  1. 七、CSS网格

    构造一个5*5的网格,如下图所示,同一颜色表示同个区域,黑线表示间隔5px 1.普通方式建立网格 <!DOCTYPE html> <html> <body> < ...

  2. (Linux)不挂断启动进程

    环境:腾讯云Ubuntu x86_64 问题:在配置应用时,需要让他后台启动,关闭ssh连接也要可以保持后台运行 解决办法: 1.使用nohup 参考链接:https://zhuanlan.zhihu ...

  3. Android笔记--查询联系人

    查询联系人 先在raw_contacts表里面查到每个联系人的不同的id,然后再根据各个id去查询各个联系人的详细信息 然后利用id得到相应的uri的值: 之后,就直接根据uri查询各个联系人的详细信 ...

  4. Mathematica处理若干个点电荷的电位电场的一个程序包

    来自 Mathematica for Theoretical Physics Electrodynamics, Quantum Mechanics, General Relativity and Fr ...

  5. StyleGAN 生成 AI 虚拟人脸,再也不怕侵犯肖像权

    目录 什么是 StyleGAN 如何使用 StyleGAN 下载项目 修改项目 MSVC 运行项目 运行结果 什么是 StyleGAN GAN 是机器学习中的生成性对抗网络,目标是合成与真实图像无法区 ...

  6. ASP.NET Core - 选项系统之选项使用

    上一篇 ASP.NET Core - 选项系统之选项配置 中提到 IOptions.IOptionsMonitor 和 IOptionsSnapshot 三个接口,通过这三个接口都可以从依赖注入容器中 ...

  7. git的Rebase和Merge之间的区别

    有人会说Merge更好,因为它保留了最完整的工作历史.其他人则认为,Rebase变得更整洁,这使审阅者的生活更轻松,更高效.本文将解释合并和重新设置之间的区别是什么,使用它们之一有什么好处. 从根本上 ...

  8. 数据挖掘关联分析—R实现

    关联分析 关联分析又称关联挖掘,就是在交易数据.关系数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式.关联.相关性或因果结构.或者说,关联分析是发现交易数据库中不同商品(项)之间的联系 ...

  9. python实现微信自动发消息功能

    import timeimport uiautomation as autofrom uiautomation.uiautomation import Bitmapimport win32clipbo ...

  10. pysimplegui之第一个程序,包括回调函数,事件,阻塞等待内容

    自定义窗口 API 调用(您的第一个窗口) 总结一下:我遇到的坑, 比如拿输入框的内容的时候可以直接通过value[key] 几种窗口模式就是什么时候用timeout这个参数 关闭窗口可以的一边形式 ...