【C++】类与对象 上

news2024/11/25 22:24:34

前言

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

引入

在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.coloradmin.cn/o/1176045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新一代存储介质技术SCM探讨

什么是SCM介质&#xff1f; SCM介质现状 SCM介质产品形态和在存储系统中的应用 高性能SSD 字节型DIMM形态 小结 什么是SCM介质&#xff1f; SCM&#xff08;Storage Class Memory&#xff09;是当前业界非常热门的新介质形态&#xff0c;同时具备持久化&#xff08;Storage Cla…

LangChain+LLM实战---Midjourney(v5.1) Prompt深度剖析

原文&#xff1a;Anatomy of Midjourney Promps: In-Depth Study for effective Prompting Strategies — V5.1 examples 作者&#xff1a;Michael King 你是否曾经发现自己盯着Midjourney的空白画布&#xff0c;手指悬停在键盘上&#xff0c;让我问自己&#xff1a;“我应该…

Python中最常用的10个内置函数!

更多资料获取 &#x1f4da; 个人网站&#xff1a;涛哥聊Python Python作为一种多用途编程语言&#xff0c;拥有丰富的内置函数库&#xff0c;这些函数可以极大地提高开发效率。本文将介绍Python中最常用的10个内置函数&#xff0c;它们的功能各有不同&#xff0c;但在实际编程…

【unity实战】实现类似英雄联盟的buff系统(附项目源码)

文章目录 先来看看最终效果前言开始BUFF系统加几个BUFF测试1. 逐层消失&#xff0c;升级不重置剩余时间的BUFF2. 一次性全部消失&#xff0c;升级重置剩余时间的BUFF3. 永久BUFF&#xff0c;类似被动BUFF4. 负面BUFF&#xff0c;根据当前BUFF等级计算每秒收到伤害值&#xff0c…

腾讯会议录制视频全攻略,让会议记录更轻松

随着远程办公和线上教学的兴起&#xff0c;腾讯会议已成为一种常见的在线会议工具&#xff0c;用于实现远程办公、在线教育和协作。然而&#xff0c;许多用户不知道如何记录这些重要的会议&#xff0c;特别是希望将其保留作为会议纪要或培训资料。在本文中&#xff0c;我们将探…

康耐视深度学习ViDi-Tool菜单介绍

Train 训练该工具中所有标注的图像 Process 处理该工具中所有的图像 Abort 中止当前训练或处理任务 Rename 更改当前工具的名称 Clone 克隆当前所选工具 Import导出当前所选工具 Export导入相对应的工具 Edit Models编辑工具中的模型 Update Parameters更新当前工具参数 工具菜…

CODESYS开发教程12-任务配置

今天继续我们的小白教程&#xff0c;老鸟就不要在这浪费时间了&#x1f60a;。 前面一期我们介绍了CODESYS的库管理器。这一期就来介绍一下CODESYS工程中“任务配置”的使用。看过前面教程的朋友可能记得&#xff0c;在工程的基本组成中有简单介绍过如何使用任务配置添加任务&…

Python中使用Tkinter和Difflib模块实现文本比对功能

目录 一、引言 二、Tkinter简介 三、Difflib简介 四、实现文本比对功能 五、代码展示 六、注意事项 总结 一、引言 在Python中&#xff0c;Tkinter和Difflib是两个非常实用的模块。Tkinter是Python的标准图形用户界面(GUI)库&#xff0c;可以用来创建桌面应用程序。Dif…

【0基础】全网最细致【PYTHON入门】教学

前言 可以说很多人学编程&#xff0c;不玩点爬虫确实少了很多意思&#xff0c;不管是业余、接私活还是职业爬虫&#xff0c;爬虫世界确实挺精彩的。 今天来给大家浅谈一下爬虫&#xff0c;目的是让准备学爬虫或者刚开始起步的小伙伴们&#xff0c;对爬虫有一个更深更全的认知…

动态壁纸软件Live Wallpaper HD mac中文版功能特色

Live Wallpaper HD mac提供了一系列美丽的主题场景&#xff0c;将为您的桌面增添活力。从城市景观、日落到遥远的星系&#xff0c;每个屏幕都有特别的触感&#xff0c;可以定制您的天气小部件和时钟样式&#xff0c;并使用您喜爱的图片创建您自己的个性化壁纸。 Living Wallpap…

使用 Rust 进行程序

首先&#xff0c;我们需要安装必要的库。在终端中运行以下命令来安装 scraper 和 reqwest 库&#xff1a; rust cargo install scraper reqwest 然后&#xff0c;我们可以开始编写程序。以下是一个基本的爬虫程序&#xff0c;用于爬取 上的图片&#xff1a; rust use reqwe…

QT实现的一个MVP设计模式demo

最近做qt 项目,发现网上基于MVP设计模式的QT例程很少&#xff0c;这里写一个demo示例可作为参考&#xff1a; 一、简要概述 MVP是由MVC发展而来&#xff0c;总体目的与作用相同。都是为了软件构架有层次之分&#xff0c;使得核心逻辑、界面控制、数据这三者分层清晰明了。减少…

椭圆滤波器

之前的文章 信号去噪 中列出了7种常用的信号去噪算法&#xff0c;对于后两种算法——深度学习和奇异值分解(SVD)&#xff0c;我现在也不太理解&#xff0c;就先不写了。 很多朋友留言又提了一些算法&#xff0c;今天一起来聊聊椭圆滤波器。 椭圆滤波器&#xff08;Elliptic F…

极致性能优化:前端SSR渲染利器Qwik.js | 京东云技术团队

引言 前端性能已成为网站和应用成功的关键要素之一。用户期望快速加载的页面和流畅的交互&#xff0c;而前端框架的选择对于实现这些目标至关重要。然而&#xff0c;传统的前端框架在某些情况下可能面临性能挑战且存在技术壁垒。 在这个充满挑战的背景下&#xff0c;我们引入…

新大陆NVH200-AP(U)扫码枪在上位机软件开发中的应用

前言: 由于本次使用的是USB接口的扫码枪 1、先安装Nset软件,使用扫码枪扫描“启动设置条码”,然后扫描“USB CDC串口”条码 2、打开NSet软件,点击“刷新按钮” 就能找到扫码枪设备 3、设置条码后缀 点击“高级设置”,然后点击“数据编辑”,在“后缀”那里设置结束符…

〔001〕虚幻 UE5 安装教程

✨ 目录 🎈 下载启动程序🎈 注册个人账户🎈 选择引擎版本🎈 选择安装选项🎈 虚幻商城的使用🎈 每月免费插件🎈 安装插件🎈 下载启动程序 下载地址:https://www.unrealengine.com/zh-CN/download点击上面地址,下载 UE5 启动程序并安装🎈 注册个人账户 打开商…

发送Http请求的HttpClientUtil工具

发送Http请求的HttpClientUtil工具 代码如下&#xff1a; /*** author xuan* create 2023/11/6*/ public class HttpUtil {// 创建连接池管理器private static final PoolingHttpClientConnectionManager connMgr new PoolingHttpClientConnectionManager();// http客户端pr…

Java 求两个向量余弦相似度计算代码

Java 求两个向量余弦相似度计算代码 公式&#xff1a; 源码&#xff1a; public Double getCosineSimilarity( List<Double> x, List<Double> y ){double numerator 0D;for( int i 0; i < x.size(); i ){numerator x.get( i ) * y.get( i );}double leftD…

在 Python 中使用 Selenium 按文本查找元素

我们将通过示例介绍在Python中使用selenium通过文本查找元素的方法。 在 Python 中使用 Selenium 按文本查找元素 软件测试是检查应用程序是否满足用户需求的技术。 该技术有助于使应用程序成为无错误的应用程序。 软件测试可以手动完成&#xff0c;也可以通过某些软件完成。…

电脑怎么恢复删除的文件?恢复文件必备3个方法分享!

“由于我经常需要处理大量的文件&#xff0c;我在电脑里建了一个文件夹放比较重要的文件&#xff0c;但不知道由于我误操作还是什么原因&#xff0c;文件夹里的部分文件消失了&#xff0c;我现在很是烦恼&#xff0c;有什么方法可以帮我恢复删除的文件吗&#xff1f;” 处理电脑…