【C++】类与对象 上

前言

感觉自己的基础还是不够好 最近打算在学新知识的同时 把之前的一些知识点再复习一下

引入

在C语言的学习中 我们学习过结构体 我们用结构体来描述复杂的对象 在结构体中只能定义变量
而在C++的结构体中 我们可以在C++中 定义函数

下面给出一个简单的例子
创建一个结构体 并且包含打印其信息的showinfo函数

struct Stu
{void showinfo(){cout << name << " " << sex << " " << age << endl;}char name;char sex;int age;
};

并且 在cpp中 还创建了**类(class)**来替代结构体

类的模板

给出一个定义类的模板

class ClassName
{//类体:由成员函数和成员变量组成
};//与结构体类似的是:最后都有分号

解释说明:
class是关键字 ClassName是类的名字
类体中内容称为类的成员:类中的变量称为类的属性成员变量; 类中的函数称为类的方法或者成员函数

类的定义

类有两种定义方式

第一种

声明和定义全部放在类体中
需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。

class Person
{
public:void showinfo(){cout << name << " " << sex << " " << age << endl;}
public:string name;string sex;int age;
};

第二种

声明放在.h文件中,成员函数定义放在.cpp文件中,
注意:成员函数名前需要加类名::
一般情况下,更期望采用第二种方式。

在person.h文件中

class Person
{
public:void showinfo()public:string name;string sex;int age;
};

在person.cpp文件中

#include"person.h"void Person::showinfo()
{cout << name << " " << sex << " " << age << endl;
}

类的访问限定符及封装

访问限定符

访问限定符,顾名思义 访问类的对象是受限制的
在这里插入图片描述

补充说明

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现为止
  4. 如果后面没有访问限定符就直到类结束
  5. class的默认访问权限是private 、struct则为public
  6. 访问限定符只在编译时有用 当数据映射到内存后 访问限定符之间没有任何区别

封装

不做过多介绍 直接来看下面的八股文

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。

封装本质上是一种管理,让用户更方便使用类。
比如:对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件。

对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的等,用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。

在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用。

类的作用域

类定义了一个新的作用域 类中所有成员都在类的作用域中 在类体外定义成员时,需要使用**:😗*(作用域操作符)来指明成员属于哪个类域

通俗来讲就是 出门在外 一个人(成员)是一个家庭(类域)中的一员 自我介绍的时候用::来介绍自己是谁家的

下面给出一段例子

class Person
{	
public:void PrintPersoninfo();
private:string name;string gender;int age; 
};//这里要指定PrintPersonInfo属于Person这个类域
void Person::PrintPersoninfo()
{cout << name << endl << gender << endl << age << endl; 
}

类的实例化

用类类型创建对象的过程,称为类的实例化

再来看一段八股文

  1. 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
    比如:入学时填写的学生信息表,表格就可以看成是一个类,来描述具体学生信息。
    类就像谜语一样,对谜底来进行描述,谜底就是谜语的一个实例。
    谜语:“年纪不大,胡子一把,主人来了,就喊妈妈” 谜底:山羊
  2. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量

可以看下面这个例子:

int main()
{Person.age = 100;//会报错:编译失败:error C2059: 语法错误:“.”return 0;
}

Person类是没有空间的,只有Person类实例化出的对象才有具体的年龄。

  1. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

类对象模型

计算类对象的大小

(了解即可

//类中既有成员变量又有成员函数
class A1
{
public:void PrintA(){count << a << endl;}
private:char a;
}
//类中仅有成员函数
class A2
{
public:void f(){};
}
//类体为空:空类
class A3
{}

大家可以先猜想一下 类对象是如何存储的呢
A:
存储类中的各个成员
B:
代码只保存一份,在对象中保存存放代码的地址
C:
只保存成员变量, 成员函数存放在公共的代码段

直接给出结论:
一个类的大小:就是这个类中成员变量之和 要注意内存对齐

特别的:对于空类 编译器给空类一个字节来唯一标识这个类的对象

说到内存对齐,我们可以联想到结构体的内存对齐规则
大家可以自行了解一下(绝对不是我懒得打字了

结语

关于类与对象的学习 先暂时到这里 我们下篇文章见~~~~
希望你有所收获

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/161992.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据脱敏(Data masking plugin functions)

对于企业而言&#xff0c;数据脱敏可以在数据共享或测试时用于保护敏感数据&#xff08;如信用卡&#xff0c;社保卡&#xff0c;地址等&#xff09;。通过对敏感数据进行脱敏处理&#xff0c;组织可以最大限度地降低数据泄露和未经授权访问的风险&#xff0c;同时仍能够使用真…

前端框架Vue学习 ——(七)Vue路由(Vue Router)

文章目录 Vue路由使用场景Vue Router 介绍Vue Router 使用 Vue路由使用场景 使用场景&#xff1a;如下图&#xff0c;点击部门管理的时候显示部门管理的组件&#xff0c;员工管理的时候显示员工管理的组件。 前端路由&#xff1a;指的是 URL 中的 hash(#号)与组件之间的对应关…

2019数二(二重积分的不等式问题)

注&#xff1a; 1、在相同积分区域内的积分比较大小&#xff1a;被积函数大的积分值大&#xff0c;被积函数小的积分值小 2、在区间[0&#xff0c;Π/2]上 &#xff1a;sinx < x < tanx

前端面试题之CSS篇

1、css选择器及其优先级 标签选择器: 1类选择器、属性选择器、伪类选择器&#xff1a;10id选择器&#xff1a;100内联选择器&#xff08;style“”&#xff09;&#xff1a;1000!important&#xff1a;10000 2、display的属性值及其作用 属性值作用none元素不显示&#xff0c…

zookeeper本地部署和集群搭建

zookeeper&#xff08;动物园管理员&#xff09;是一个广泛应用于分布式服务提供协调服务Apache的开源框架 Zookeeper从设计模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架&#xff0c;它 负责存储和管理大家都关心的数据 &#xff0c;然 后 接受观察…

初阶JavaEE(14)表白墙程序

接上次博客&#xff1a;初阶JavaEE&#xff08;13&#xff09;&#xff08;安装、配置&#xff1a;Smart Tomcat&#xff1b;访问出错怎么办&#xff1f;Servlet初识、调试、运行&#xff1b;HttpServlet&#xff1a;HttpServlet&#xff1b;HttpServletResponse&#xff09;-C…

QQ怎么恢复聊天记录?3个方法解决聊天记录丢失问题!

对很多人来说&#xff0c;QQ聊天记录保留了宝贵的信息与青春回忆。这是使得许多小伙伴久久不舍得卸载QQ的重要原因之一。然而&#xff0c;由于各种原因&#xff0c;有时我们会遇到聊天记录丢失的情况。qq怎么恢复聊天记录&#xff1f;如果您意外删除了QQ聊天记录并感到焦虑、不…

【大数据】常见的数据抽取方法

常见的数据抽取方法 1.基于查询式的数据抽取1.1 触发器方式&#xff08;又称快照式&#xff09;1.2 增量字段方式1.3 时间戳方式1.4 全表删除插入方式 2.基于日志的数据抽取 数据抽取 是指从源数据源系统抽取需要的数据。实际应用中&#xff0c;数据源较多采用的是关系数据库。…

关于笔记平台的使用感受分享

关于笔记平台的使用感受分享 前言我用过的笔记平台笔记平台简单评价巴拉巴拉WPS文档/OneNote/TowerNotion/语雀各种博客平台 个人使用率最高的平台 前言 最近也有部分同学问我平常用的笔记平台是什么&#xff0c;以及我比较推荐的平台是什么。这里不是广告哈&#xff0c;因为我…

数据可视化:地图

1.基础地图的使用 如何添加颜色表示层级 代码实现 """基础地图的使用 """ from pyecharts.charts import Map from pyecharts.options import VisualMapOpts# 准备地图对象 map Map() # 准备数据 data [("北京市", 9),("上海市…

墨者学院 内部文件上传系统漏洞分析溯源

打开web页面&#xff1a; 是个文件上传&#xff0c;先随便上传一个 txt 文件并抓包&#xff1a; 木马文件&#xff1a; <%eval request ("123")%>发现是个 IIS&#xff0c;并且给了文件的上传路径 upload&#xff0c;那就尝试上传 asp 一句话&#xff0c;直接…

Android Studio(对话框AlertDialog)

前言 前面介绍了常用控件的相关属性&#xff0c;那些控件的使用起来也很容易。在本节及后面的章节介绍的控件将是相比于前面使用起来较为复杂的&#xff08;不过使用多了&#xff0c;也很容易上手&#xff09;。 这些控件常常需要配合java代码来使用&#xff0c;比如说对话框、…