文章目录

  • 1.类
  • 2.对象
  • 3.封装
  • 4.继承(派生)
  • 5.多态

1.类

类就是同一类事物的总称,比如我(一个对象)可以讲话,那么基本上所有人都具备这个属性,就将我这一类的对象称为类,类的思想就是这样产生的。更恰当的描述:类就是世间事物的抽象称呼,而对象就是这个事物相对应的实体,人类就是一个类,写博文的我,看博文的你就是人类这个类的实例化,这也是为什么人类里面有个类,动物类,植物类,都有一个类,单说一个动物类,我们只能知道是动物,,却无法确定是那种动物,而对象就是具体实例化动物。在C++语言中,类中对象的行为是以函数(方法)的形式定义的,对象的属性是以成员变量的形式定义的,而类包括对象的属性和函数。

在C语言中,我们经常用到被称之为结构体的一个东西

struct {char name[10];int age;
};

何时使用结构体?当我们需要处理自定义数据类型,结构体是一种很好的选择,结构体的默认访问权限是public(公开)的,也只能是public,并且没有this指针,不支持任何函数,也不可以继承,它体现在将不同数据类型的进行封装,并且仅仅是用于不同类型数据的封装。

而C++中的类在C结构体的基础上,除了public访问,还增加了private(私有),protected(保护),并且默认是private。

类型 说明
public 公共,被public声明的成员变量或者成员函数可以被任何成员访问
private 私有,被private声明的成员变量或成员函数不能被除了自己以外任何成员访问
protected 保护,被protected声明的成员变量或成员函数可以被除了自己以外的子类访问

除此之外,类还增加了this,函数,继承。

类是反映现实事物的一种抽象,而结构体的作用只是一种包含了具体不同类别数据的一种包装,相对于结构体,类的概念更加牛逼。

让我们看一个最简单的类

class Animal {string name;int age;
};

是不是感觉只是将struct换成了class,表面是这样,实际区别就是面向过程和面向对象的编程思路。
接下来让我们看什么是对象。


2.对象

现实世界中,随处可见的一种事物就是对象,对象是事物存在的实体,比如人,桌子,电脑,眼前的屏幕。在计算机的世界中,面对对象程序设计的思想要以对象来思考问题,首先要将现实的实体抽象为对象,然后考虑这个对象所具备的属性和行为,比如现在正在写这篇博文的我,就是一个对象,将我抽象为对象,然后识别这个对象的属性,对象具备的属性都是静态属性,比如我是男的,身高168,可以说话等等,接着识别这个对象的动态行为,如睡觉,看书,写博文。当识别出这个对象的属性和行为后,这个对象就被定义完成了,然后可以根据再根据我,了解其他人,可以将这些人特有的属性和行为封装起来来描述人,由此可见,类实质上就是封装对象属性和行为的载体,而对象则是类抽出来的一个实例。

实例化一个对象(在这之前,先把类中成员变量设置为public),有两种方法

//第一种
Animal dog;
dog.name = "花狗"; //注意这种实例化,用的是.,表示dog是一个对象或者结构体
dog.age = 21;//第二种
Animal * cat = new Animal(); //后面这个函数被称为构造函数
cat->name = "花猫";//注意这种实例化,用的是->,->是成员提取,cat只能是指向类、结构、联合的指针
cat->age = 21;

以上两种方式皆可实现类的实例化,有new的区别在于:

1.前者在栈中分配内存(一般用.),后者为动态内存分配,在堆中(一般用->),在一般应用中是没有什么区别的,但动态内存分配会使对象的可控性增强。
2.不加new在堆栈中分配内存
3.大程序用new,小程序直接申请
4.只是把对象分配在堆栈内存中
5.new必须delete删除,不用new系统会自动回收内存

小知识:

站在操作系统的角度
栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

站在数据结构的角度
有栈(又叫堆栈)和堆,这个是数据结构里面的定义,和操作里面的定义不同。


3.封装

面向对象程序设计具有:封装性,继承性,多态性。
封装是面向对象编程的核心思想。将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想,就比如我们使用一个库函数时,我们只需要知道它的作用就可以了,没必要去了解它的内部工作,比如print函数,我们只需要知道用它可以输出我们我们想输出的内容即可,更通俗的讲,我们只需要写完博文点击发布就可以,而不用去管它如何上传至互联网,采用封装的思想保证了类内部数据结构的完整性,使用该类的用户不能轻易地直接操作此数据结构,只能执行类允许公开的数据,这也就避免了外部操作对内部数据的影响,提高了程序的可维护性。

//Animal.h
class Animal {//将成员变量设置为私有,保证安全
private:string name;int age;//赋值void setName(String name);void getAge(int age);//取值String getName();int getAge();//利用Setter:赋值 Getter:取值的方式,隐藏内部实现细节,保证代码的安全,同时也可以提升数据的安全性
};
//通常将类的声明和定义分别写在头文件和源文件中,这里有利于可读和修改。
//Animal.cpp
void Animal::setName(String name)
{this.name = name;
}
void Animal::setAge(int age)
{this.age= age;
}
String Animal::getName(String name)
{return this.name;
}
int Animal::getAge(int age)
{return this.age;
}
//在C++里面,每一个对象都能通过this指针来访问自己的地址,通俗一点就是,谁调用,this就指向谁。
int main
{Animal * cat = new Animal(); //后面这个函数被称为构造函数
//cat->name = "花猫";
//cat->age = 21; 现在这两种都是错误的方式,并且变量都暴露在了外面cat->setName("花猫");
cat->setAge(21);//使用这种方式,我们不必关心函数内部如何处理,也无法直接接触到类成员变量,这便体现了封装和安全return 0;
}

4.继承(派生)

类和类之间具有关系,比如老师类和学生类,学电脑的一类人和学英语的一类人,当处理一个问题时,我们可以将一些有用的类保留下来,在遇到同样的问题时拿来复用,做一个不恰当的比喻,学电脑的现在要读一篇英文文章,假设他们英语很烂,这时应该想到学英语的人,我们可以使用学英语这类人特殊的属性,我们不看其他属性,我们只使用会英语这门属性,这样就节省了学电脑的还需要学习英语来读英语文章,这样就大大节省了学电脑的时间,这就是继承的基本思想,可见设计软件的代码时可以使用继承思想来缩短软件开发的时间,复用那些以前已经定义好的类,提高系统性能,减少系统在使用过程中出现错误的几率,这就是为什么有些人写完一个功能会把代码保存起来,下次需要这个需求,我们就可以拿来代码直接用。
在C++中,人类这种大类被称为父类,而学习电脑,学习英语这几类人被称为子类,他们都是父类分离出来的,他们有着必然的联系,他们都是人。

下面的例子和上面的例子无关,我们继续拿Animal这个类说。

Animal这个类已经定义了名字和年龄,如果我们现在想要定义一只猫(cat类),它也有名字和年龄,和发出的声音,就可以在Animal类的基础上进行添加声音即可,这种操作被称为是继承,cat类继承于Animal类,也可以说成事cat类是Animal的派生类。

想要继承Animal这个类,需要加入这个类的头文件。

#include "Animal.h"class cat:public Animal //表示cat类继承于Animal这个类,至于前面的public,我们先不管
{String sound;//添加对应的get/setvoid setSound(String sound);String getSound();
}

实例化cat类对象


Cat cat = new Cat();
cat->setName("花猫");
cat->setAge(21);
cat->setSound("喵喵喵");

5.多态

多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)。根据调用对象的不同方法执行不同的内容,多态具体表现在重写和重载,就是类的多种表现方式比如同名不同参子类重写父类。重载发生在一个类中.重写发生在子类,意思就是子类重写父类相同名称的方法。

重载的特性:方法名相同.返回类型,传入方法的参数不同(包括个数和类型)。
重载是编译时期的多态,又叫静态多态,编译时期的多态是靠重载实现的,根据参数个数,类型和顺序决定的(必须在同一个类中)

重写的特性:方法名相同,返回类型,参数均相同,必须发生在子类。
重写是运行时的多态,在运行时根据实际情况决定调用函数

下面的print函数有三种重载(为了方便观察,我将声明和定义写在一块),会在编译时,根据参数不同,返回值不同选择不同的类型。


class Animal
{String name;int age;void print(String name){cout<<name;}void print(int age){cout<<age;}void print(String name,int age){cout<<name<<age;}
};

下面来看重写的例子,在运行中决定行为

class Animal {public:string name;int age;virtual void print(){cout << "我不会叫" << endl;}
};
class dog :public Animal
{public:virtual void print(){cout << "汪汪"<<endl;}
};
class cat :public Animal
{public:virtual void print(){cout << "喵喵"<<endl;}
};int main()
{Animal * animal1 = new dog();animal1->print();Animal * animal2 = new cat();animal2->print();return 0;
}


virtual:虚函数是指一个类中你希望重载的成员函数 ,当你用一个基类指针或引用 指向一个继承类对象的时候,调用一个虚函数时, 实际调用的是继承类的版本。

C++中类,对象,封装,继承(派生),多态相关推荐

  1. 面向对象 详解笔记 方法 类 对象 封装 继承 重写 多态 接口

    文章目录 面向过程&面向对象 面向过程 面向对象 什么是面向对象 回顾方法及加深 方法的定义 修饰符 返回类型 break:跳出switch,结束循环和return的区别 方法名:注意规范就o ...

  2. python类与对象 封装继承与多态 0308

    类与对象 初始化方法 init方法 带参实例化类 del方法 str方法 私有 继承 方法的重写 super 父类名称调父类方法 调用父类私有 间接调用 多继承 新式类经曲类 多态 类属性 类方法 静 ...

  3. python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态

    六.Python面向对象--类与对象\封装\继承\多态 1.什么是面向对象编程 1.1 程序设计的范式:程序可控,易于理解 1.2 抽象并建立对象模型 1.3 程序是不同对象相互调用的逻辑.每个对象在 ...

  4. Java回顾 封装 继承和多态

    封装 什么是封装 封装:就是隐藏对象的属性和实现细节,仅对外提供公共访问方式. 封装时的权限控制符区别如下: 封装的意义 对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象 ...

  5. java 继承重写_java 封装 继承 重写 多态

    封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. 好处: 将变化隔离.便于使用.提高重用性.提高安全性 封装原则: 将不需要对外提供的内容都隐藏起来.把属性都隐藏,提供公共方法对其访问. ...

  6. 面向对象(类/对象/封装/继承/static/内存类加载)

    >面向对象:万物皆对象: >类和对象: 从代码的角度来说:类是代码的载体. 从逻辑角度来说:类是静态文件:对象是内存中的地址: 形象的来说,类就是一个模具,是用来生产对象的:对象是基于类产 ...

  7. 本质论之封装继承和多态的介绍

    关于 类,我有一些话想说 说到类那就说到了面向对象的灵魂了,没有它也就没有了封装.继承and多态这些东西了.我还记得在读研期间每次看到这些都望而却步,甚至我搞不懂对象和类的区别(这里防止有人也不知道区 ...

  8. 黑马程序员_JAVA之面向对象(封装,继承和多态)

    ------- android培训.java培训.期待与您交流!---------- 面向对象 一.面向对象概述 定义: 面向对象(Object Oriented,OO)是软件开过过程中使用一种思维方 ...

  9. java 封装 继承和多态

    2019独角兽企业重金招聘Python工程师标准>>> 多态无处不在.引用的概念最为困难.理解了引用才能理解多态的意义以及应用. 多态的应用的一大前提是继承.以及继承中的重写方法.继 ...

  10. 浅谈对于封装、继承与多态的理解(Java)

    目录 封装 继承 父类成员的访问 如何在子类中访问父类同名的成员 子类构造方法 代码块在继承上的执行顺序 多态 多态的实现条件 重写 多态的优缺点 面向对象程序的三大特征:封装继承和多态. 封装 · ...

最新文章

  1. 《Go语言从入门到实战》学习笔记(2)——编写第一个Go语言程序
  2. UNIQUE和PRIMARY 约束的区别
  3. SAP CRM BSP UI gif and color handling
  4. hibernate与jpa_将JPA Hibernate与OptaPlanner集成
  5. 面试分享:那些年我经历过的一些面试,以及得到的一些面试心得!
  6. mysql查看数据库表大小语句_MySQL查看数据库表容量大小的命令语句讲解
  7. selenium2.0处理case实例(二)
  8. STM32断言assert_param 和 assert_failed使用
  9. 安平仓管王 3000xp v3.2 免费下载
  10. 陈华主讲后盾网Laravel框架重入门到实战教程 Laravel博客项目实战教程 包含课件源码
  11. 整理springmvc+mybatis+velocity的整合一
  12. 牛客网刷题java之(斐波那契数列)一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
  13. android 4 源码目录,LXR 目录Android 源码
  14. 自然语言处理实战——对电影评论进行情感分析(英文)
  15. 互联网摸鱼日报(2023-03-17)
  16. 宽带信号的DOA估计学习笔记(一)
  17. brew 一直等待_58岁上海股神自爆交易铁则:80%时间的等待+20%的时间操作,精髓...
  18. GEE引擎设置装备物品绑定的方法
  19. java -- cropper裁剪图片并base64上传 移动端简单示例
  20. A Two-stage Unsupervised Approach for Low light Image Enhancement(一种两阶段无监督的微光图像增强方法)

热门文章

  1. 产品经理遇到瓶颈,如何突破?硅谷产品教父Marty Cagan 告诉你
  2. springboot中service中注入dao失败测试类中注入成功_聊一聊 Java 服务端中的乱象
  3. java dataoutputstream_Java DataOutputStream类
  4. [Python黑帽] 一.获取Windows主机信息、注册表、U盘历史痕迹和回收站文件
  5. 原型设计模式—解决随机乱序出试卷(试题顺序、选项顺序随机打乱)
  6. 华为鸿蒙系统智能手机_知科技-新鲜事|华为将发布鸿蒙系统智能手机
  7. 电瓶车续航测试软件,寻找真实续航英雄!7款纯电动车续航测试
  8. 自助游最佳时间去最佳地方
  9. java实况足球2014,有趣的足球题材游戏有哪些
  10. 解决 VSCode Ctrl Shift P 快捷键不可用