【C++】探索C++中的类与对象(上)

​​在这里插入图片描述

🌱博客主页:青竹雾色间.
😘博客制作不易欢迎各位👍点赞+⭐收藏+➕关注
在这里插入图片描述
✨人生如寄,多忧何为 ✨


C++是一种强大的编程语言,其面向对象的特性使得代码结构更加清晰、易于维护和扩展。在C++中,类与对象是面向对象编程的核心概念之一,它们为程序员提供了一种组织和封装代码的方法。本文将深入探讨C++中的类与对象,包括其定义、使用和特性以及this指针的使用。


目录

  • 一.面向过程和面向对象初步认识
  • 二.类与对象的概念
    • 2.1类与对象的特性
    • 2.2类的引用
    • 2.3类的定义
    • 2.4 类的作用域
    • 2.5对象的创建与使用
    • 2.6类的实例化
  • 三 .类对象模型
    • 3.1 如何计算类对象的大小
    • 3.2 类对象的存储方式猜测
  • 四. 构造函数与析构函数
  • 五.成员访问权限
  • 六.this指针
    • 6.1 this指针的引出
    • 6.2 this指针的特性

一.面向过程和面向对象初步认识

在编程中,有两种主要的编程范式:面向过程面向对象
面向过程编程
将问题分解为一系列的步骤和函数,强调程序的流程控制,分析出求解问题的步骤,通过函数调用逐步解决问题
例如:C语言
面向对象编程(OOP)
将问题分解为一系列的对象,强调对象的属性和行为。面向对象编程更加灵活、模块化和可扩展。
例如:Java、Python、C++等

二.类与对象的概念

在C++中,类是一种用户自定义的数据类型,用于封装数据和方法。类由数据成员和成员函数组成,数据成员存储类的属性,而成员函数则用于操作这些属性。通过类,可以创建对象,对象是类的实例化,它具有类中定义的属性和行为。

2.1类与对象的特性

  1. 封装:类封装了数据和方法,隐藏了实现细节,使得代码更加模块化和可维护。

  2. 继承:通过继承,一个类可以从另一个类继承属性和行为,提高了代码的重用性。

  3. 多态:多态性允许不同的对象对同一消息作出不同的响应,增强了代码的灵活性和可扩展性。

2.2类的引用

C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如:用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现,会发现struct中也可以定义函数。

2.3类的定义

在C++中,可以使用class关键字来定义类。以下是一个简单的类的定义示例:

class MyClass {private:int num;public:void setNum(int n) {num = n;}int getNum() {return num;}
};

上述代码定义了一个名为MyClass的类,其中包含一个私有数据成员num和两个公有成员函数setNumgetNum。私有数据成员只能在类的内部访问,而公有成员函数可以被外部访问。

类的两种定义方式都是常见的,各有其优缺点。

1. 将声明和定义全部放在类体中的方式:

  • 优点:方便,代码简洁,所有的类成员都可以在一个地方找到,可读性好。
  • 缺点:如果类体过于庞大,会导致代码不易维护,编译时间增加。此外,如果成员函数在类中定义,编译器可能会将其视为内联函数处理,这可能会增加代码的体积。

示例:

class MyClass {
public:void myFunction() {// 函数定义}
};

2. 将类声明放在.h文件中,成员函数定义放在.cpp文件中的方式:

  • 优点:可以使代码更易维护,类的接口和实现分离,隐藏了类的实现细节,方便对类进行封装。此外,当多个文件需要使用同一个类时,只需包含头文件,而不必重新编译整个类的实现文件。
  • 缺点:可能会增加一些额外的工作量,需要在.h和.cpp文件中进行对应的操作,有时可能会导致一些函数重复声明的问题。

示例:

// MyClass.h
class MyClass {
public:void myFunction();
};// MyClass.cpp
#include "MyClass.h"
void MyClass::myFunction() {// 函数定义
}

选择哪种方式取决于项目的具体需求和个人偏好。在较小的项目中,通常将声明和定义放在类体中更为方便,而在大型项目中,通常将声明和定义分离以提高代码的可维护性和可重用性。

2.4 类的作用域

类的成员具有类作用域,即可以在类的内部直接访问其他成员,而不需要使用类名或对象名作为限定符。这使得类的成员之间可以直接交互,简化了代码的编写。(需要使用 :: 作用域操作符指明成员属于哪个类域。)

2.5对象的创建与使用

通过类可以创建对象,对象是类的实例化。可以使用以下语法创建对象:

MyClass obj;

然后可以通过对象来访问类中的成员函数:

obj.setNum(10);
int number = obj.getNum();

2.6类的实例化

类的实例化是指使用类类型创建对象的过程。在这个过程中,会为对象分配实际的内存空间,并存储类的成员变量。类本身只是对对象进行描述的模型,定义了对象具有的属性和行为,但并不占用实际的物理空间。

举个例子,类就像是一个建筑设计图,描述了建筑的结构和特征,但并不是实际的建筑物。而类的实例化就像是根据设计图建造出实际的房子,创建了具体的对象,并分配了存储空间来存储对象的属性值。

通过类的实例化,我们可以创建多个不同的对象,并分别对它们进行操作,实现了代码的重用和模块化。

三 .类对象模型

3.1 如何计算类对象的大小

#include <iostream>class A
{
public:void PrintA(){std::cout << _a << std::endl;}
private:char _a;
};int main()
{std::cout << "Size of class A: " << sizeof(A) << std::endl;return 0;
}

通常情况下,编译器会对成员变量进行对齐,以提高访问速度。对于大多数平台,char 类型的变量通常对齐到1字节。因此,在这种情况下,类 A 的大小将是 _a 的大小,即1字节。

3.2 类对象的存储方式猜测

  • 对象中包含类的各个成员

在这里插入图片描述
缺陷:每个对象中成员变量是不同的,但是调用同一份函数,如果按照此种方式存储,当一个类创建多个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间。那么如何解决呢?

  • 代码只保存一份,在对象中保存存放代码的地址
    在这里插入图片描述
  • 只保存成员变量,成员函数存放在公共的代码段
    在这里插入图片描述
// 类中既有成员变量,又有成员函数
class A1 {public:void f1(){}private:int _a;};// 类中仅有成员函数
class A2 {public:void f2() {}};// 类中什么都没有---空类
class A3{};//sizeof(A1) : 4//sizeof(A2) : 1 (成员函数不占据类对象的内存空间,只有一个字节)//sizeof(A3) : 1(注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。)

结论:一个类的大小,实际就是该类中”成员变量”之和()得注意内存对齐

结构体内存对齐规则

  1. 第一个成员在与结构体偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 注意:对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。 VS中默认的对齐数为8
  3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

四. 构造函数与析构函数

构造函数是一种特殊的成员函数,用于在对象创建时初始化对象的数据成员。析构函数则用于在对象销毁时释放资源。以下是构造函数和析构函数的示例:

class MyClass {private:int num;public:// 构造函数MyClass() {num = 0;}// 析构函数~MyClass() {// 可选的资源释放操作}
};

五.成员访问权限

在这里插入图片描述

C++中的类提供了三种成员访问权限:私有(private)、保护(protected)和公有(public)。私有成员只能在类的内部访问,保护成员可以在类的内部和派生类中访问,而公有成员可以在任何地方访问。默认情况下,类的成员是私有的。
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

六.this指针

6.1 this指针的引出

我们先来定义一个日期类Date

 class Date{ 
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout <<_year<< "-" <<_month << "-"<< _day <<endl;}private:int _year;     // 年int _month;    // 月int _day;      // 日int a;};int main(){Date d1, d2;d1.Init(2022,1,11);d2.Init(2022, 1, 12);d1.Print();d2.Print();return 0;}

上述代码定义了一个日期类 Date,其中包含了两个成员函数 Init 和 Print,用于初始化日期和打印日期。在调用成员函数时,如 d1.Init(2022, 1, 11),编译器会自动传递当前对象的地址作为隐含的参数给成员函数,这个参数就是 this 指针。因此,成员函数中可以通过 this 指针来访问当前对象的成员变量。

6.2 this指针的特性

  1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
  2. 只能在“成员函数”的内部使用
  3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。
    所以对象中不存储this指针。
  4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递
    在这里插入图片描述

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

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

相关文章

Day83:服务攻防-开发组件安全JacksonFastJson各版本XStreamCVE环境复现

目录 J2EE-组件Jackson-本地demo&CVE 代码执行 (CVE-2020-8840) 代码执行 (CVE-2020-35728&#xff09; J2EE-组件FastJson-本地demo&CVE FastJson < 1.2.24 FastJson < 1.2.47 FastJson < 1.2.80 (利用条件比较苛刻) J2EE-组件XStream-靶场&CVE …

高度不同的流体瀑布css实现方法

商城商品列表 实现瀑布流展示&#xff0c;通过flex或grid实现会导致每行中的列高度一致&#xff0c;无法达到错落有致的感觉&#xff1b; 为此需要用到&#xff1a; CSS columns 属性 columns 属性是一个简写属性&#xff0c;用于设置列宽和列数。 CSS 语法 columns: column-wi…

字节新作:图像生成质量超越DiT

&#x1f31f;每日更新最新高质量论文&#xff0c;关注我&#xff0c;时刻关注最新大模型进展。&#x1f31f; &#x1f4cc; 元数据概览&#xff1a; 标题&#xff1a;Visual Autoregressive Modeling: Scalable Image Generation via Next-Scale Prediction作者&#xff1a…

算法设计与分析实验报告java实现(排序算法、三壶谜题、交替放置的碟子、带锁的门)

一、 实验目的 1&#xff0e;加深学生对算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、排序算法…

【随笔】Git 高级篇 -- 相对引用2(十三)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

4.4C++

1 #include <iostream> #include <cmath> using namespace std; class A{ private:int a;// 判断一个数是否为质数bool isP(int num) {if (num<2) return false;for (int i2;i<sqrt(num);i) {if (num % i 0) {return false;}}return true;} public:// 构造…

open-cd框架调试记录

源于论文Changer: Feature Interaction Is What You Need forChange Detection 源码位置&#xff1a;open-cd/README.md at main likyoo/open-cd (github.com) 同样是基于MMSegmentation框架的代码&#xff0c;不符合本人编程习惯所以一直也没有研究这东西&#xff0c;近期打…

Linux进程概念(二):进程的基本概念与进程的创建

目录 进程的基本概念 进程控制块-PCB 学前补充 预备知识 创建&#xff08;子&#xff09;进程 创建&#xff08;子&#xff09;进程的原因 理解fork有两个返回值 进程的基本概念 基本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等 内核层面&#x…

(源码+讲解+部署)基于Spring Boot和Vue的考研教育系统的设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2024年Java精品实战案例《128套》 &#x1f345;文末获取源码联系&#x1f345; &#x1f31f…

打造专业运营团队,武汉星起航引领全球跨境电商未来趋势

近年来&#xff0c;随着全球经济的不断发展&#xff0c;跨境电商作为国际贸易的一种新模式&#xff0c;已然成为推动全球经济增长的新引擎。在这个浩荡的潮流中&#xff0c;武汉星起航以亚马逊自营店铺为依托&#xff0c;凭借丰富的实战运营经验和专业的团队&#xff0c;正积极…

Spring Boot 介绍

1、SpringBoot 介绍 用通俗的话讲&#xff0c;SpringBoot 在Spring生态基础上发展而来&#xff0c;它的发现不是取代Spring&#xff0c;是为了让人们更容易使用Spring。 2、相关依赖关系 Spring IOC/AOP > Spring > Spring Boot > Spring Cloud 3、 SpringBoot工作原…

四信AI智能视频边缘分析盒+传感云平台,开启食品安全智慧监管新模式

方案背景 民以食为天&#xff0c;食品是人类生存必备的物质之一&#xff0c;食品生产安全关乎每个人的生命健康与社会可持续发展。在食品生产过程中&#xff0c;如何实现安全、健康生产是监管机构首要考虑因素&#xff0c;也是当今社会必须共同关注与努力的方向。 监管机构必…

【C++】vector问题解决(非法的间接寻址,迭代器失效 , memcpy拷贝问题)

送给大家一句话&#xff1a; 世界在旋转&#xff0c;我们跌跌撞撞前进&#xff0c;这就够了 —— 阿贝尔 加缪 vector问题解决 1 前言2 迭代器区间拷贝3 迭代器失效问题4 memcpy拷贝问题 1 前言 我们之前实现了手搓vector&#xff0c;但是当时依然有些问题没有解决&#xff…

牛市股票还会亏钱?--外观模式

1.1 牛市股票还会亏钱&#xff1f; 炒股&#xff0c;碰到熊市&#xff0c;亏得一塌糊涂。 "我们公司的人现在都在炒股票&#xff0c;其实大部分人都不太懂&#xff0c;就是因为现在股市行情很火&#xff0c;于是都在跟风呢&#xff01;" 刚入市的人&#xff0c;什么都…

Day84:服务攻防-端口协议桌面应用QQWPS等RCEhydra口令猜解未授权检测

目录 端口协议-口令爆破&未授权 弱口令爆破 FTP&#xff1a;文件传输协议 RDP&#xff1a;Windows远程桌面协议 SSH&#xff1a;Linux安全外壳协议 未授权案例(rsync) 桌面应用-QQ&WPS&Clash QQ RCE 漏洞复现 WPS RCE 漏洞复现 Clas* RCE 漏洞复现 知识点…

【攻防世界】ics-05

php://filter 伪协议查看源码 preg_replace 函数漏洞 1.获取网页源代码。多点点界面&#xff0c;发现点云平台设备维护中心时&#xff0c;页面发生变化。 /?pageindex 输入什么显示什么&#xff0c;有回显。 用php://filter读取网页源代码 ?pagephp://filter/readconvert.…

设计模式 --5观察者模式

观察者模式 观察者模式的优缺点 优点 当一个对象改变的时候 需要同时改变其他对象的相关动作的时候 &#xff0c;而且它不知道有多少具体的对象需要改变 应该考虑使用观察者模式 。观察者模式的工作就是解除耦合 让耦合双方都依赖与抽象 而不是具体 是的各自改变都不会影响另…

【文献分享】ALKEMIE:加速材料发现和设计的智能计算平台

题目&#xff1a;ALKEMIE: An intelligent computational platform for accelerating materials discovery and design 链接&#xff1a;DOI: 10.1016/j.commatsci.2020.110064 ALKEMIE&#xff1a;加速材料发现和设计的智能计算平台 摘要 通过传统的试错方式开发具有目标特性…

ChatGPT 的核心 GPT 模型:探究其生成式预训练变换架构的革新与应用潜力

GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型是一种深度学习模型&#xff0c;由OpenAI于2018年首次提出&#xff0c;并在随后的几年中不断迭代发展&#xff0c;包括GPT-2、GPT-3以及最新的GPT-4。GPT模型在自然语言处理&#xff08;NLP&#xff09;领域…

ssm基于HTML5的出租车管理系统论文

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此出租车信息的管…