当前位置: 首页 > news >正文

类和对象【基础概念】

全文目录

  • 类的定义
    • 定义方式
  • 类的访问限定符
    • 封装(面向对象的三大特性之一)
  • 类对象模型
    • 类对象的存储方式
    • 类对象的大小计算
  • `this`指针
    • `this`指针的特性
    • **`this`指针可以为空吗?**

类的定义

在C++中,C语言中的结构体struct中除了定义变量外还能定义函数,这是C++将结构体升级成了类,同时还引入了定义类的关键字class

struct structName
{// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号class className
{// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号

类体中内容称为类的成员:类中的变量称为类的属性成员变量; 类中的函数称为类的方法或者成员函数

定义方式

  1. 声明即定义

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

在这里插入图片描述

  1. 声明和定义分离

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

在这里插入图片描述

类的访问限定符

C++实现封装的方式: 用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

访问限定符的种类:

  1. p u b l i c public public (公有)
  2. p r o t e c t e d protected protected (保护)
  3. p r i v a t e private private (私有)

访问限定符的说明:

  1. p u b l i c public public 修饰的成员在类外可以直接被访问
  2. p r o t e c t e d protected protected p r i v a t e private private 修饰的成员在类外不能直接被访问(此处 p r o t e c t e d protected protected p r i v a t e private private 是类似的)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. 如果后面没有访问限定符,作用域就到} 即类结束。
  5. c l a s s class class 的默认访问权限为 p r i v a t e private private s t r u c t struct struct p u b l i c public public (因为 s t r u c t struct struct 要兼容C)

封装(面向对象的三大特性之一)

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

在C++语言中实现封装,可以通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用。

类对象模型

类定义出来后相当于一个数据类型,用类类型声明的变量叫做对象。

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

类对象的存储方式

对象中只保存成员变量,成员函数存放在公共的代码段

在这里插入图片描述

类对象的大小计算

直接通过计算验证:

// 类中既有成员变量,又有成员函数
class A1 {
public:void f1(){}
private:int _a;
};
sizeof(A1) = 4// 类中仅有成员函数
class A2 {
public:void f2() {}
};
sizeof(A2) = 1// 类中什么都没有---空类
class A3
{};
sizeof(A3) = 1;

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

注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。

this指针

同一个类可以实例化出多个对象,在同一个成员函数体中没有关于不同对象的区分,那么是如何做到数据的独立性的呢?

C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

在这里插入图片描述

this指针的特性

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

this指针可以为空吗?

// 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
class A
{
public:void Print(){cout << "Print()" << endl;}
private:int _a;
};int main()
{A* p = nullptr;p->Print();return 0;
}答案:
正常运行打印Print()
解析:
这是因为成员函数在编译阶段地址就确定好了,这里相当于是正常的调用了一个函数。

再来看一段程序

// 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
class A
{
public:void Print(){cout << _a << endl;}
private:int _a;
};int main()
{A* p = nullptr;p->PrintA();return 0;
}答案:运行崩溃
解析:通过this指针访问_a时,发生了空指针的解引用

结论: 当没有通过this指针访问成员变量时,可以为空,但是尽量不要为空。

相关文章:

类和对象【基础概念】

全文目录 类的定义定义方式 类的访问限定符封装&#xff08;面向对象的三大特性之一&#xff09; 类对象模型类对象的存储方式类对象的大小计算 this指针this指针的特性**this指针可以为空吗&#xff1f;** 类的定义 在C中&#xff0c;C语言中的结构体struct中除了定义变量外还…...

如何测试生成式人工智能(AIGC)

简介&#xff1a;在人工智能日趋普及的今天&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;已经成为不可忽视的一个分支。从自动化生成新闻、编写代码到图像和音频生成&#xff0c;AIGC几乎无处不在。但如何确保这些生成的内容达到预期标准、安全可靠&#xff0c;同时…...

机器学习算法详解3:逻辑回归

机器学习算法详解3&#xff1a;逻辑回归 前言 ​ 本系列主要对机器学习上算法的原理进行解读&#xff0c;给大家分享一下我的观点和总结。 本篇前言 ​ 本篇对逻辑回归的算法原理进行解读。 目录结构 文章目录 机器学习算法详解3&#xff1a;逻辑回归1. 引子2. sigmoid函数3. 原…...

linux命令集合

cd:切换文件路径 pwd:显示当前所处的路径 mkdir&#xff1a;创建目录比如mkdir test touch:创建一个空文件touch test.txt in:用于指定文件夹在另一个位置建立同步的链接in -s /lib/test1 /user/lj 在user目录下建立指向/lib/test1 目录的lj文件 cat:cat file(查看文件内…...

实现卓越供应链:RFID技术的革命性应用

在现代制造业中&#xff0c;供应链和物流的高效运作至关重要&#xff0c;它不仅影响着生产效率&#xff0c;还直接关系到企业的竞争力和客户满意度。为了应对这些挑战&#xff0c;越来越多的企业开始关注智能制造RFID智能设备&#xff0c;将其应用于供应链和物流管理&#xff0…...

从JVM角度看继承

从JVM角度看继承 最近重读了周志明老师的《深入理解JAVA虚拟机》一书&#xff0c;看完大有收获&#xff0c;但仍对继承情况下对象内存布局有所疑惑&#xff0c;所以查阅资料&#xff0c;结合本书进行分析 参考文档&#xff1a; 【深入理解JVM】&#xff1a;Java类继承关系中…...

基于Python和mysql开发的看图猜成语微信小程序(源码+数据库+程序配置说明书+程序使用说明书)

一、项目简介 本项目是一套基于Python和mysql开发的看图猜成语微信小程序&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都…...

Unity入门教程||创建项目(上)

一、介绍 目的&#xff1a;通过尝试制作一款使用玩家角色把小球弹飞的简单小游戏&#xff0c;熟悉使用Unity进行游戏开发的基本流程。 软件环境&#xff1a;Unity 2017.3.0f3&#xff0c;Visual Studio 2013 二、创建新项目 1&#xff0c;启动Unity后将出现一个并列显示Pro…...

Openbmc编译

1.网址的问题解决 原文 Modifying /conf/local.conf was the only solution that worked for me. Simply add one of the two options:#check connectivity using google CONNECTIVITY_CHECK_URIS "https://www.google.com/"#skip connectivity checks CONNECTIVI…...

美国CN2服务器速度怎么样

美国服务器以免备案、大带宽、性价比高的优势&#xff0c;多用于企业、电商、外贸、视频等个中大型网站建设。但是&#xff0c;因中美服 务器接口原因&#xff0c;导致某些服务器的网络并不稳定&#xff0c;这时候就会对美国服务器产品失望&#xff0c;解决这种问题的方法就是选…...

K8S原理架构与实战教程

文章目录 一、背景1.1 物理机时代、虚拟机时代、容器化时代1.2 容器编排的需要 二、K8S架构2.2 Worker节点 三、核心概念3.1 Pod3.2 Deployment3.3 Service3.4 Volume3.5 Namespace 四、K8S安装五、kubectl常用命令六、K8S实战6.1 水平扩容6.2 自动装箱6.2.1 节点污点6.2.2 Pod…...

基于C#的图书管理系统数据库设计报告

第一章 问题描述 1.1 图书管理系统简介 本系统利用.NET处理数据库的功能&#xff0c;实现对图书馆信息的管理。主要功能为管理有关读者、出版社、书籍、借阅和管理者的信息等。 本系统的结构分为读者信息管理模块、出版社信息管理模块、书籍信息管理模块、借阅信息管理模块、…...

【Express.js】pm2进程管理

pm2进程管理 本节我们将介绍如何使用 pm2 运行和监管我们的 express 项目 准备工作 一个 express 项目全局安装 pm2 npm install -g pm2pm2使用介绍 启动应用 你可以用纯命令去运行一个node项目&#xff0c;假设原本运行项目使用 node src/index.js可以跑起来一个项目&am…...

Nginx部署前后端分离项目(Linux)

Nginx代理前端页面、后端接口 一、前端打包二、后端打包三、Linux部署Nginx启动、暂停、重启服务器部署文件地址&#xff1a; 一、前端打包 npm run build二、后端打包 通过Maven 使用package打包 三、Linux部署 安装Nginx 安装环境 yum -y install gcc pcre pcre-devel z…...

Docker网络

1 简介 网络原理 下载iproute工具&#xff08;linux&#xff09;ip addr查看地址映射 容器内ip地址会进行映射符号。docker分配的地址。 77: eth0if78: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:…...

第15章_瑞萨MCU零基础入门系列教程之Common I2C总线模块

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…...

《TCP/IP网络编程》阅读笔记--多播与广播

目录 1--多播 2--多播代码实例 3--广播 4--广播代码实例 1--多播 多播方式的数据传输是基于 UDP 完成的&#xff0c;多播数据包的格式与 UDP 数据包相同&#xff1b; 多播与 UDP 的区别&#xff1a;UDP 数据传输以单一目标进行&#xff0c;多播数据同时传递到加入&#xff…...

聚观早报|华为Mate 60 Pro支持面容支付;特斯拉重回底特律车展

【聚观365】9月8日消息 华为Mate 60 Pro已支持面容支付 特斯拉将重回底特律车展 iPhone在美国有1.67亿用户 韩国半导体8月份出口85.6亿美元 比亚迪元PLUS冠军版将于9月15日上市 华为Mate 60 Pro已支持面容支付 毫无预热的华为Mate 60 Pro突然在华为商城首批开售&#xf…...

本地缓存Caffeine的缓存过期淘汰策略

本地缓存是一种将数据存储在应用程序的内存中&#xff0c;以加速数据访问的技术。缓存的数据可以是频繁访问的数据&#xff0c;以减少对慢速数据源&#xff08;如数据库或网络&#xff09;的访问。缓存通常有一些缓存过期淘汰策略&#xff0c;以确保缓存中的数据保持最新和有效…...

激光焊接汽车尼龙塑料配件透光率测试仪

激光塑性成型技术是近年来塑性加工界出现的一种新技术。通常塑料主要是通过加热加压依赖模具成型。这对于单品种、大批量生产是有效的&#xff1b;而对于各种不同形状的塑料制件则需要昂贵的模具‚装置也较庞大。 高度聚焦的激光束垂直照射在待变形的板料上‚由于塑料直接吸收激…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...