C++ --> 类和对象(一)

欢迎来到我的Blog,点击关注哦💕

前言

前面讲到了C++的入门需要学习的知识,是为了后面更好的学习。学习是不断深入的,内容是不断复杂的。笃定信心。

一、面向对象编程(OOP)和面向过程编程(POP)的认识

面向过程编程(Procedural Programming,简称POP)

POP特性

  • 程序的核心是函数,这些函数是一系列预定义操作的集合,旨在执行特定任务。
  • 这种方法让程序员可以重用代码,提高效率,并且使代码更易于跟踪和维护。
  • 通过将复杂问题拆解为更小、更具体的任务,面向过程编程使解决问题变得更加直接.

面前对象编程(Object Oriented Programming,简称OOP)

OOP特性

  • 封装:是将对象的属性和方法结合在一起,并尽可能隐藏对象的内部细节,只暴露必要的接口供外部使用。
  • 继承:允许一个类(子类)继承另一个类(父类)的属性和方法,实现代码的重用和层次化组织。
  • 多态:允许使用相同的接口来处理不同类型的对象,具有不同的实现,增加了代码的灵活性和可扩展性.

二、类

类的定义:类是用户自定义的数据类型,它允许将数据(成员变量)和操作数据的函数(成员函数)封装在一起。

类的定义

class ClassName {
public:
    // 公共成员声明
private:
    // 私有成员声明
protected:
    // 受保护成员声明
};

访问限定修饰符

  • public(公有):公有成员可以在类的内部、派生类和类的外部访问。它们构成了类的公共接口,通常用于定义可以被外部直接访问和操作的方法和属性。
  • protected(受保护):受保护的成员只能在类的内部和派生类中访问,而不能在类的外部访问。它们用于实现基类和派生类之间的共享实现细节。
  • private(私有):私有成员只能在类的内部访问,外部无法直接访问。私有成员用于隐藏类的内部实现细节,防止外部代码直接访问和修改类的状态

类和结构区别

在C++ 中将 C语言中 struct升级成了类,在C++中strcut也可以声明类。

  • 结构(struct)默认访问类型是 public
  • 类的默认访问类型是private

类的作用域

**类 **: 类的作用域是指类定义中声明的成员变量和成员函数的可见范围。类的作用域由类名和作用域解析运算符(::)共同控制。

类的实例化

类的实例化:指创建类的具体对象的过程。这个过程通常涉及到分配内存空间给新创建的对象,并设置其初始属性值。

例如:

class Stack
{
	//类定义
};

int main()
{
	Stack st;

	return 0;
}

对象的大小

对象的大小类似于C语言中的结构体大小的计算方法。

  • 第一个成员在与结构体偏移量为0的地址处。
  • 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的对齐数为8
  • 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
  • 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整 体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍
class A1 {
public:
    void f1(){}
private:
    int _a;
};
// 类中仅有成员函数
class A2 {
public:
   void f2() {}
};
// 类中什么都没有---空类
class A3
{};
  • sizeof(A1) = 4
  • sizeof(A2) = 1
  • sizeof(A3) = 1
C++标准规定空类必须具有非零大小的原因主要有以下几点
  • 确保对象地址唯一性:C++标准要求不同的对象不能具有相同的地址。如果空类的大小为0,那么在数组中连续创建多个空类对象时,这些对象将没有区分它们的内存空间,从而违反了这一原则.

  • 避免指针运算问题:如果空类的大小为0,那么使用指针进行算术运算时将无法正确计算偏移量,因为除以0是非法的操作。这将导致编译器需要编写额外的代码来处理这些异常情况.

  • 内存分配和对齐:新对象的分配需要不同的内存地址,且内存分配通常考虑到对齐要求。一个非零大小的空类可以确保即使是最基本的对象也至少占据一个内存单元,满足基本的内存对齐要求.

  • 优化空间利用:C++标准允许空基类优化,即如果空类作为基类时不会与同一类型的另一个对象或子对象分配在同一地址,编译器可以选择不为其分配任何空间。这意味着空类的非零大小实际上不会增加派生类的内存占用,除非派生类本身需要更多空间.

三、this指针

this指针是一个隐含的成员指针,它在类的非静态成员函数中可用,指向调用该函数的对象实例。

  • this指针是一个常量指针,其指向的内容可以被修改,但指针本身不能被重新赋值。
  • this指针的类型是指向类类型的指针,即const ClassType*
  • this指针在成员函数的整个执行期间都存在,其生命周期与函数的其他参数相同。
  • this指针不是对象内存的一部分,因此不会影响对象的大小
class A
{
public:
 void Print()
 {
 cout << "Print()" << endl;
 }
private:
 int _a;
};
int main()
{
 A* p = nullptr;
 p->Print();
 return 0;
}
class B
{ 
public:
    void PrintB() 
   {
        cout<<_a<<endl;
   }
private:
 int _a;
};
int main()
{
    B* p = nullptr;
    p->PrintB();
    return 0;
}

  • A会正常运行, 因为p调用的公共代码块的,没有进行成员访问。
  • B段代码进行了成员访问,Print函数内部 this->_a。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于React 实现井字棋

一、简介 这篇文章会基于React 实现井字棋小游戏功能。 二、效果演示 三、技术实现 import {useEffect, useState} from "react";export default (props) > {return <Board/> }const Board () > {let initialState [[, , ], [, , ], [, , ]];const [s…

【CW32F030CxTx StartKit开发板】利用超声波传感器实现智能灯控

目录 1、超声波传感器 2、硬件连线 3. 程序开发 3.1 超声波测距 3.2 LED控制 4. 演示视频 本文首发于21ic。 感谢21ic和武汉芯源提供的测试机会。 在上一篇帖子中介绍了CW32F030CxTxStartKit 评估板的环境构建。本次介绍如何利用超声波传感器实现人来灯亮&#xff0c;人…

Milvus lite start 及存储策略

背景 今天开始写下Milvus&#xff0c;为了方便&#xff0c;我直接使用的是 milvus-lite 版本&#xff0c;default 情况下&#xff0c;你可能不知道他到底将 db 存储到什么位置了。启动 default-server&#xff0c;看下Milvus 的start及存储逻辑 主逻辑 def start(self):sel…

合并pdf的方法,如何合并pdf文件到一个pdf,简单方法

在现代办公和学习中&#xff0c;pdf格式的文件因其跨平台兼容性和安全性得到了广泛应用。然而&#xff0c;有时我们需要将多个pdf文件合并成一个&#xff0c;以便于管理和分享。本文将详细介绍几种合并pdf的方法&#xff0c;帮助读者轻松完成pdf文件的合并工作。 方法一、使用p…

【NLP学习路线的总结】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 目录 0. 👉前言1. 👉前置知识👉基础数学知识👉编程语言👉…

matlab:对带参数a关于x的方程求解

题目 讲解 简洁对各个式子的内部含义用浅显易懂的话语总结出来了&#xff0c;耐心体会 f(a) (x)exp(x)x^ax^(sqrt(x))-100;%因为下面的fzero的第一个数需要一个fun&#xff0c;所以这里有两个句柄&#xff0c;第一个a是输入的&#xff0c;第二个x是需要被解出的 A0:0.1:2;%创…

12种增强Python代码的函数式编程技术

前言 什么是函数式编程&#xff1f; 一句话总结&#xff1a;函数式编程(functional programming)是一种编程范式&#xff0c;之外还有面向对象&#xff08;OOP&#xff09;、面向过程、逻辑式编程等。 函数式编程是一种高度抽象的编程范式&#xff0c;它倡导使用纯函数&#x…

VTD的RDB介绍,从入门到放弃

文章目录 前言一、二、常见的RDB数据类型1、RDB_OBJECT_STATE_BASE_t2、RDB_OBJECT_STATE_EXT_t3、RDB_OBJECT_STATE_t4、RDB_SENSOR_OBJECT_t5、RDB_COORD_t6 RDB_GEOMETRY_t7、RDB_MSG_ENTRY_HDR_t 三、疑惑的问题点&#xff1a;1、在RDB_OBJECT_STATE_EXT_t中这两个的区别是…

前端面试题26(vue3中响应式实现原理)

Vue 3 中响应式系统的实现主要依赖于 ES6 的 Proxy 对象&#xff0c;这与 Vue 2 中使用 Object.defineProperty 的方式有着本质的区别。Proxy 提供了一种更为强大且灵活的方法来拦截和定制对象的操作&#xff0c;例如获取、设置属性值等。下面是对 Vue 3 响应式系统实现方式的详…

5款好用公司监控软件分享|管理者必看

当今社会&#xff0c;企业数据安全和员工工作效率成为了管理者不可忽视的重要议题。 选择合适的公司监控软件&#xff0c;不仅有助于提升管理效率&#xff0c;还能有效保障企业信息安全。 下面小编将为您分享五款备受好评的公司监控软件&#xff0c;助力管理者更好地管理企业…

faskapi好用的模板

在Web开发领域&#xff0c;FastAPI作为一个基于Python的高性能Web框架&#xff0c;因其快速、易用以及强大的功能而备受开发者青睐。关于FastAPI的好用模板&#xff0c;这里介绍几个不同角度的模板或项目框架&#xff0c;以帮助您更好地理解和选择适合自己的起点。 1. FastAPI…

《基于 Kafka + Flink + ES 实现危急值处理措施推荐和范围校准》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 近期刚转战 CSDN&#xff0c;会严格把控文章质量&#xff0c;绝不滥竽充数&#xff0c;欢迎多多交流。&am…

.locked勒索病毒解析与防护指南

引言 随着信息技术的飞速发展&#xff0c;网络安全问题日益严峻&#xff0c;其中勒索病毒成为威胁企业和个人数据安全的重要隐患之一。在众多勒索病毒家族中&#xff0c;.locked勒索病毒以其独特的加密方式和广泛的传播途径&#xff0c;引起了广泛的关注。本文将从多个方面详细…

张量分解(1)——初探张量

&#x1f345; 写在前面 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;这里是hyk写算法了吗&#xff0c;一枚致力于学习算法和人工智能领域的小菜鸟。 &#x1f50e;个人主页&#xff1a;主页链接&#xff08;欢迎各位大佬光临指导&#xff09; ⭐️近…

解决线程不安全问题的几种方式

线程不安全问题 日常生活中我们会经常碰到在不同的平台上买各种票的问题&#xff0c;例如在App、线下售票窗口等购买火车票、电影票。这里面就存在着线程安全的问题&#xff0c;因为当多个线程访问同一个资源时&#xff0c;会导致数据出错&#xff0c;例如甲和乙两人同时看中了…

2024最新版若依-RuoYi-Vue3-PostgreSQL前后端分离项目部署手册教程

项目简介: RuoYi-Vue3-PostgreSQL 是一个基于 RuoYi-Vue3 框架并集成 PostgreSQL 数据库的项目。该项目提供了一套高效的前后端分离的开发解决方案&#xff0c;适用于中小型企业快速构建现代化的企业级应用。此项目结合了 RuoYi-Vue-Postgresql 和 RuoYi-Vue3 的优点&#xff0…

libaom 编码器实验 AV1 标准 SVC 分层编码

SVC编码 视频SVC编码&#xff0c;即Scalable Video Coding&#xff08;可适性视讯编码或可分级视频编码&#xff09;&#xff0c;是H.264/MPEG-4 AVC编码的一种扩展&#xff0c;它提供了更大的编码弹性&#xff0c;并且具有时间可适性&#xff08;Temporal Scalability&#x…

React Hooks:上天在提醒你,别再用Class组件了!

React Hooks&#xff1a;上天在提醒你&#xff0c;别再用Class组件了&#xff01; React Hooks 的出现可以说是前端界的一场革命。它不仅让我们告别了繁琐的 Class 组件&#xff0c;还让代码变得更加简洁、易读、易维护。如果你还在固守 Class 组件的阵地&#xff0c;那么这篇…

vue3项目实战中的接口调用

vue项目组成 一个项目往往由这几个部分组成。&#x1f447;&#x1f447; 其中在src文件夹中的内容如下&#x1f447;&#x1f447; 我们常常将接口文件&#xff0c;新建在文件夹src下&#xff0c;一般命名为api&#xff0c;api内的文件便是接口文件。&#x1f447;&#x1f4…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…