C++类和对象:面向对象编程的核心。| 面向对象还编什么程啊,活该你是单身狗。
- 👑专栏内容:C++学习笔记
- ⛪个人主页:子夜的星的主页
- 💕座右铭:日拱一卒,功不唐捐
文章目录
- 一、前言
- 二、面向对象编程
- 三、类和对象
- 1、类的引入
- 2、类的定义
- Ⅰ、声明和定义在一起
- Ⅱ、声明和定义分开
- Ⅲ、成员变量命名建议
- 3、类的封装和访问限定符
- Ⅰ、封装
- Ⅱ、访问限定符
- 4、类的作用域
- 5、类的实例化
- 四、总结
一、前言
类和对象是C++ 在 C 语言的基础上新增加的特性,而正是因为这一特性,让C++成为了面向对象的编程语言。本文将跟随C++大哥的脚步,介绍类和对象这一重要特性。
二、面向对象编程
百度百科:面向对象程序设计(Object Oriented Programming)作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事物特征的。任何一个模型都不可能反映客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它所涉及的范围内更普遍、更集中、更深刻地描述客体的特征。通过建立模型而达到的抽象是人们对客体认识的深化。
以洗衣服为例:
像C语言你这种面向过程编程的做法就是手洗。所以,你想洗一件衣服的话,洗衣服的每一个过程你自己都要做一遍。
而C++洗一件衣服就很简单了,只需要把衣服放进洗衣机里就行了。
对比一下上面两种洗衣服的方法。面向过程,是自己在干活,而面向对象是将事物高度抽象化,所以面向对象必须先建立抽象模型,或者更形象点说就是建立一个机器,之后直接使用模型(机器)来干活。
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,然后通过函数调用来逐步解决问题。
C++是面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
三、类和对象
1、类的引入
类可以看作是C语言里面结构体(struct
)的升级版,在C语言结构体中只能定义变量,在C++中,类不仅可以定义变量,也可以定义函数。
举个例子:
计算一个学生的总分。
C语言是先定义一个结构体,然后再写一个计算输出总分的函数。
struct Student {//结构体包含的成员变量int number;float math;float english;float chinese;
};
//求总分函数
int Sum(struct Student stu)
{return stu.chinese + stu.english + stu.math;
}
//输出函数
void print(struct Student stu)
{//调用求总分函数float sum = Sum(stu);//输出结构printf("学号:%d 的总分是 %.2f\n", stu.number,sum );
}
int main() {struct Student s1;s1.number = 01;s1.chinese = 100;s1.english = 100;s1.math = 100;//调用函数print(s1);return 0;
}
再看C++的做法,C++是把实现这个功能的所有成员和函数都放在这个类里面。
以后再想实现这个功能,就直接用这个类就行了。
struct Student
{int number;float math;float english;float chinese;int Sum(struct Student stu){return stu.chinese + stu.english + stu.math;}void print(struct Student stu){float sum = Sum(stu);printf("学号:%d 的总分是 %.2f\n", stu.number, sum);}};
int main() {struct Student s1;s1.number = 01;s1.chinese = 100;s1.english = 100;s1.math = 100;s1.print(s1);return 0;
}
注意:上面的定义,在C++中更喜欢用class
来代替struct
。
当然使用struct
也行,不过与class
相比会有点不一样。具体有啥不一样,请继续看下文。
2、类的定义
class className
{
// 类体:由成员函数和成员变量组成
};
class
为定义类的关键字,ClassName
为类的名字,{ }
中为类的主体,注意类定义结束时后面分号不能省略。
- 类体中内容称为类的成员。
- 类中的变量称为类的属性或成员变量。
- 类中的函数称为类的方法或者成员函数。
Ⅰ、声明和定义在一起
声明和定义可以全部放在类体中的定义,但是需要注意的是成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
Ⅱ、声明和定义分开
类的声明放在.h
文件中,成员函数定义放在.cpp
文件中。
注意:此时成员函数名前需要加类名::
Ⅲ、成员变量命名建议
class Date
{
public:void Init(int year){// 这里的year到底是成员变量,还是函数形参?year = year;}
private:int year;
};
为了避免这种成员变量和函数形参分不清楚的情况,我们一般都是加个前缀或者后缀标识进行区分。
class Date
{
public:void Init(int year){year_ = year;}
private:int year_;
};
3、类的封装和访问限定符
Ⅰ、封装
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来
和对象进行交互。封装本质上是一种管理,让用户更方便使用类。
打个比方:
对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件。对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的等,用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
Ⅱ、访问限定符
public
修饰的成员在类外可以直接被访问protected
和private
修饰的成员在类外不能直接被访问(此处protected
和private
是类似的)- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
- 如果后面没有访问限定符,作用域就到
}
即类结束。
5.class
的默认访问权限为private
,struct
为public
(因为struct
要兼容C语言)
现在回答最开始的问题,C++中struct和class的区别是什么?
C++需要兼容C语言,所以C++中struct
可以当成结构体使用。另外C++中struct
还可以用来定义类。和class
定义类是一样的,区别是struct
定义的类默认访问权限是public
,class
定义的类默认访问权限是private
。
注意:在继承和模板参数列表位置,struct和class也有区别,后序再给大家介绍。
4、类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用:: 作用域
操作符指明成员是属于哪个类域。
class Person
{
public:void PrintPersonInfo();
private:char _name[20];char _gender[3];int _age;
};
//这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{cout << _name << " "<< _gender << " " << _age << endl;}
5、类的实例化
用类类型创建对象的过程,称为类的实例化。
- 类是对对象进行描述的,是一种复杂数据类型的声明,不占用内存空间。
- 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。
举个例子:类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图。只是设计出了需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。
四、总结
- C++是面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
- 封装就是将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来
和对象进行交互。封装本质上是一种管理,让用户更方便使用类。 - 在类体外定义成员时,需要使用
:: 作用域
操作符指明成员是属于哪个类域。 - 对象是对客观事物的抽象,类是对对象的抽象。 类是一种抽象的数据类型。 它们的关系是,对象是类的实例,类是对象的模板。
- 如果有对象。请不要因为学习面向对象编程,而忽略了对象的情绪。
相关文章:
C++类和对象:面向对象编程的核心。| 面向对象还编什么程啊,活该你是单身狗。
👑专栏内容:C学习笔记⛪个人主页:子夜的星的主页💕座右铭:日拱一卒,功不唐捐 文章目录一、前言二、面向对象编程三、类和对象1、类的引入2、类的定义Ⅰ、声明和定义在一起Ⅱ、声明和定义分开Ⅲ、成员变量命…...
CUDA虚拟内存管理
CUDA中的虚拟内存管理 文章目录CUDA中的虚拟内存管理1. Introduction2. Query for support3. Allocating Physical Memory3.1. Shareable Memory Allocations3.2. Memory Type3.2.1. Compressible Memory4. Reserving a Virtual Address Range5. Virtual Aliasing Support6. Ma…...
线程池小结
什么是线程池 线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。这里的线程就是我们前面学过的线程,这里的任务就是我们前面学过的实现了Runnable或Callable接口的实例对象; 为什么使用线程池 …...
vue3状态管理模式 Pinia
状态管理库 Pinia是Vue的专属状态管理库,它允许你跨组件或页面共享状态 1:安装与使用pinia 1.1 安装语法:npm install pinia1.2 创建一个pinia(根存储)并将其传递给应用程序 import { createApp } from vue import…...
python基于django的自媒体社区交流平台
自媒体社区平台采用python技术,基于django框架,mysql数据库进行开发,实现了以下功能: 本系统主要包括管理员,用户,商家和普通管理员四个角色组成,主要包括以下功能: 1;前台:首页、需求通告、优质案例、帮助中心、意见反馈、个人中心、后台管理…...
Python中类和对象(2)
1.继承 Python 的类是支持继承的:它可以使用现有类的所有功能,并在无需重新编写代码的情况下对这些功能进行扩展。 通过继承创建的新类称为 “子类”,被继承的类称为 “父类”、“基类” 或 “超类”。 继承语法是将父类写在子类类名后面的…...
SpringMvc入门
Spring与Web环境的集成 1.ApplicationContext应用上下文的获取方式 分析 之前获取应用上下文对象每次都是从容器中获取,编写时都需要new ClasspathXmlApplicationContext(Spring配置文件),这样的弊端就是配置加载多次应用上下文就创建多次。 在Web项目…...
设计模式之单例模式(C++)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一、单例模式是什么? 单例模式是一种创建型的软件设计模式,在工程项目中非常常见。通过单例模式的设计&am…...
贪心算法(基础)
目录 一、什么是贪心? (一)以教室调度问题为例 1. 问题 2. 具体做法如下 3. 因此将在这间教室上如下三堂课 4. 结论 (二)贪心算法介绍 1. 贪心算法一般解题步骤 二、最优装载问题 (一…...
【九宫格坐标排列 Objective-C语言】
一、这个案例做好之后的效果如图: 1.这个下载是可以点击的,当你点击之后,弹出一个框,过一会儿,框框自动消失,这里变成“已安装” 2.那么,我现在先问大家一句话:大家认为在这一个应用里面,它包含几个控件, 3个,哪3个:一个是图片框,一个是Label,一个是按钮, 这…...
Tomcat简介
目录 一、Tomcat简介 二、下载安装Tomcat 三、利用Tomcat部署静态页面 一、Tomcat简介 Tomcat是一个HTTP服务器,可以按照HTTP的格式来解析请求来调用用户指定的相关代码然后按照HTTP的格式来构造返回数据。 二、下载安装Tomcat 进入Tomcat官网选择与自己电脑…...
Python基础及函数解读(深度学习)
一、语句1.加注释单行注释:(1)在代码上面加注释: # 后面跟一个空格(2)在代码后面加注释:和代码相距两个空格, # 后面再跟一个空格多行注释:按住shift 点击三次"&am…...
车道线检测-PolyLaneNet 论文学习笔记
论文:《PolyLaneNet: Lane Estimation via Deep Polynomial Regression》代码:https://github.com/lucastabelini/PolyLaneNet地址:https://arxiv.org/pdf/2004.10924.pdf参考:https://blog.csdn.net/sinat_17456165/article/deta…...
GO——接口(下)
接口接口值警告:一个包含空指针值的接口不是nil接口sort.Interface接口http.Handler接口类型断言类型分支接口值 接口值,由两个部分组成,一个具体的类型和那个类型的值。它们被称为接口的动态类型和动态值。对于像Go语言这种静态类型的语言&…...
计算机网络之http02| HTTPS HTTP1.1的优化
post与get请求的区别 get 是获取资源,Post是向指定URI提交资源,相关信息放在body里 2.http有哪些优点 (1)简单 报文只有报文首部和报文主体,易于理解 (2)灵活易拓展 URI相应码、首部字段都没有…...
基于matlab使用神经网络清除海杂波
一、前言此示例演示如何使用深度学习工具箱™训练和评估卷积神经网络,以消除海上雷达 PPI 图像中的杂波返回。深度学习工具箱提供了一个框架,用于设计和实现具有算法、预训练模型和应用程序的深度神经网络。二、数据集该数据集包含 84 对合成雷达图像。每…...
每天10个前端小知识 【Day 8】
前端面试基础知识题 1. Javascript中如何实现函数缓存?函数缓存有哪些应用场景? 函数缓存,就是将函数运算过的结果进行缓存。本质上就是用空间(缓存存储)换时间(计算过程), 常用于…...
【项目精选】基于Java的敬老院管理系统的设计和实现
本系统主要是针对敬老院工作人员即管理员和员工设计的。敬老院管理系统 将IT技术为养老院提供一个接口便于管理信息,存储老人个人信息和其他信息,查找 和更新信息的养老院档案,节省了员工的劳动时间,大大降低了成本。 其主要功能包括: 系统管理员用户功能介绍&#…...
Spark SQL 介绍
文章目录Spark SQL1、Hive on SparkSQL2、SparkSQL 优点3、SparkSQL 特点1) 容易整合2) 统一的数据访问3) 兼容 Hive4) 标准的数据连接4、DataFrame 是什么5、DataSet 是什么Spark SQL Spark SQL 是 Spark 用于结构化数据(structured data) 处理的Spark模块。 1、Hive on Spa…...
升级到 CDP 后Hive on Tez 性能调整和故障排除指南
优化Hive on Tez查询永远不能以一种万能的方法来完成。查询的性能取决于数据的大小、文件类型、查询设计和查询模式。在性能测试期间,要评估和验证配置参数和任何 SQL 修改。建议在工作负载的性能测试期间一次进行一项更改,并且最好在生产环境中使用它们…...
理解HDFS工作流程与机制,看这篇文章就够了
HDFS(The Hadoop Distributed File System) 是最初由Yahoo提出的分布式文件系统,它主要用来: 1)存储大数据 2)为应用提供大数据高速读取的能力 重点是掌握HDFS的文件读写流程,体会这种机制对整个分布式系统性能提升…...
Intel处理器分页机制
分页模式 Intel 64位处理器支持3种分页模式: 32-bit分页PAE分页IA-32e分页 32-bit分页 32-bit分页模式支持两种页面大小:4KB以及4MB。 4KB页面的线性地址转换 4MB页面的线性地址转换 PAE分页模式 PAE分页模式支持两种页面大小:4KB以及…...
Linux常用命令
linux常用命令创建一个目录mkdir 命令可以创建新目录。mkdir 是 make directory 的缩写。[rootiZ2ze66tzux2otcpbvie88Z ~]# ls [rootiZ2ze66tzux2otcpbvie88Z ~]# mkdir web [rootiZ2ze66tzux2otcpbvie88Z ~]# ls web [rootiZ2ze66tzux2otcpbvie88Z ~]# 创建一个文件2.1 在 Li…...
基于STM32设计的音乐播放器
一、项目背景与设计思路 1.1 项目背景 时代进步,科学技术的不断创新,促进电子产品的不断更迭换代,各种新功能和新技术的电子产品牵引着消费者的眼球。人们生活水平的逐渐提高,对娱乐消费市场需求日益扩大,而其消费电子产品在市场中的占有份额越来越举足轻重。目前消费电…...
微服务开发
目录 微服务配置管理 权限认证 批处理 定时任务 异步 微服务调用 (协议)...
【(C语言)数据结构奋斗100天】二叉树(上)
【(C语言)数据结构奋斗100天】二叉树(上) 🏠个人主页:泡泡牛奶 🌵系列专栏:数据结构奋斗100天 本期所介绍的是二叉树,那么什么是二叉树呢?在知道答案之前,请大家思考一下…...
Java 验证二叉搜索树
验证二叉搜索树中等给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1&…...
C/C++单项选择题标准化考试系统[2023-02-09]
C/C单项选择题标准化考试系统[2023-02-09] ©3.17 单项选择题标准化考试系统 【难度系数】5级 【任务描述】 设计一个单项选择题的考试系统,可实现试题维护、自动组卷等功能。 【功能描述】 (1)管理员功能: 试题管理:每个试题包括题干、四个备选答案标准答案…...
爱了爱了,这些顶级的 Python 工具包太棒了
Python 语言向来以丰富的第三方库而闻名,今天来介绍几个非常nice的库,有趣好玩且强大!推荐好好学习。 文章目录技术交流数据采集AKShareTuShareGoPUPGeneralNewsExtractor爬虫playwright-pythonawesome-python-login-modelDecryptLoginScylla…...
【Explain详解与索引优化最佳实践】
摘要 explain命令是查看MySQL查询优化器如何执行查询的主要方法,可以很好的分析SQL语句的执行情况。每当遇到执行慢(在业务角度)的SQL,都可以使用explain检查SQL的执行情况,并根据explain的结果相应的去调优SQL等。 …...
wordpress如何发布文件夹/深圳seo公司助力网络营销飞跃
逆置打印字符串是有很多种方法的,个人感觉使用递归的方式很可以很容易的去理解栈的创建与析构,所以就稍微建立了模型;首先我们先看看理论:递归模型:1. 递归模型即是对自己本身的调用,一般用在函数或子函数函…...
直播网站建设重庆/seo网站关键词优化机构
3分钟学会,2种Wincc v14多语言组态,实现工控屏语言切换项目组态效果预览如下方动态图所示,挺好的吧!西门子WIncc V14项目多语言组态效果图一:必背技巧1.1:按钮事件组态系统函数修改显示语言(相比于利用VB脚…...
做素材网站存储/百度sem代运营
最佳答案//index下标从0开始public static int[] remove(int[]ary,int index){int[]array new int[ary.length-1]; //返回数组int flag 0; //作为标识,表示是否已删除index位置处的值,0表示未到//满足以下条件,返回nullif(arynull||ary.length<1||i…...
Asp.net 手机网站制作/淘宝推广哪种方式最好
1.算术运算符 注意: % 取余数 (1)自增 ()前自增:先自增完毕,再运算整个表达式,语句分号前面的都是运算表达式; 后自增,先运算完整个表达式(分号前面的都是表达式)&#x…...
商城网站建设哪家好/百度seo关键词排名推荐
文章目录散点图matplotlib绘制散点图seaborn绘制散点图pyecharts绘制散点图源码地址本文可以学习到以下内容:matplotlib 中文乱码解决办法seaborn 中文乱码解决办法seaborn 库csv数据下载地址用matplotlib、seaborn、pyecharts绘制散点图 散点图 小凡在做数据分析的…...
福州做网站的公/青岛网站推广企业
计算机配置内存12G,显存4G,运行有10分钟左右就提醒说内存不够用然后退出运行,直觉是程序bug问题 终于找到靠谱解决方案: http://cherishlc.iteye.com/blog/2324796 这个博客的第二个给了大致的讲解,在给出的附录中&…...