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

C++回顾(七)—— 面向对象模型

7.1 静态成员变量和静态成员函数

7.1.1 静态成员变量

  1. 关键字 static 可以用于说明一个类的成员;
  2. 静态成员提供了一个同类对象的共享机制
  3. 把一个类的成员说明为 static 时,这个类无论有多少个对象被创建,这些对象共享这个 static 成员

静态成员局部于类,它不是对象成员,在类的外部进行初始化

7.1.2 静态成员函数

  1. 静态成员函数冠以关键字static;
  2. 静态成员函数提供不依赖于类数据结构的共同操作,它没有this指针
  3. 在类外调用静态成员函数用 “类名 :: ”作限定词,或通过对象调用。

疑难问题:静态成员函数中,不能使用普通变量,只能使用静态成员变量

7.1.3 总结

  • 所有同类对象共享同一个静态成员变量;
  • 静态成员变量一定要在类的外部初始化;
  • 静态成员函数内部只能访问静态成员变量,不能访问普通变量;
  • 静态成员变量可以直接通过类名来访问
  • 静态成员函数可以通过类名直接访问
#include <iostream>using namespace std;class Student
{
public:static int count;   //静态成员变量  所有对象共享同一个静态成员变量
private:int id;
public:Student(){count++;id = count;}static int getCount()   //静态成员函数{//id++;  //静态成员函数内部只能访问静态成员变量,不能访问普通变量(这里报错)return count;}
};//注:静态成员变量一定要在类的外部初始化
int Student::count = 0;int main()
{Student s1;Student s2;cout << Student::count << endl;   //静态成员变量可以直接通过类名来访问cout << s1.getCount() << endl;cout << Student::getCount() << endl;   //静态成员函数可以通过类名直接访问return 0;
}

运行结果:
在这里插入图片描述

7.2 面向对象模型

7.2.1 基础知识

  • C++中的class从面向对象理论出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实世界中的类。从计算机的角度,程序依然由数据段和代码段构成

  • C++编译器如何完成面向对象理论到计算机程序的转化?
    换句话:C++编译器是如何管理类、对象、类和对象之间的关系?
    具体的说:具体对象调用类中的方法,那,c++编译器是如何区分,是那个具体的类,调用这个方法那?

7.2.2 编译器对成员变量和成员函数的处理机制

  • 通过上面的案例,我们可以的得出:
    C++类对象中的成员变量和成员函数是分开存储的

  • (1)成员变量
    普通成员变量:存储于对象中,与struct变量有相同的内存布局字节对齐方式
    静态成员变量:存储于全局数据区中
    在这里插入图片描述

  • (2)成员函数
    存储于代码段中。

问题出来了:
很多对象共用一块代码?代码是如何区分具体对象的那?
换句话说:int getK() const { return k; },代码是如何区分,具体obj1、obj2、obj3对象的k值?==>(通过 this 指针
在这里插入图片描述
在这里插入图片描述

7.2.3 总结

  • 1、C++类对象中的成员变量和成员函数是分开存储的。C语言中的内存四区模型仍然有效
  • 2、C++中类的普通成员函数都隐式包含一个指向当前对象的this指针
  • 3、静态成员函数与普通成员函数的区别:
    静态成员函数不包含指向具体对象的指针
    普通成员函数包含一个指向具体对象的指针
#include <iostream>using namespace std;class Test
{
private:int a;char b;    
public:Test(int _a){	this->a = _a;}void show()    //等价于void show(Test *this)   所有的成员函数隐藏了一个参数 this指针{cout << this->a << endl;}
};int main()
{Test t1(0);cout << sizeof(t1) << endl;  //不包含静态成员变量Test t2(1);t1.show();   //等价于 t1.show(&t1);t2.show();   //等价于 t2.show(&t2);return 0;
}

运行结果:
在这里插入图片描述

7.2.4 const修饰成员函数

  • const关键字写在函数名的后面;
  • 常函数只能访问访问变量,不能修改变量。
    在这里插入图片描述
    示例代码:
#include <iostream>using namespace std;class Test
{
private:int a;int b;
public:Test(){a = 0;b = 1;}void show() const   //注意位置 常函数{//a++;             //常函数只能访问变量,不能修改变量(所以这里会报错)cout << a << " "  << b << endl;}
};int main()
{Test t1;t1.show();return 0;
}

运行结果:
在这里插入图片描述

7.2.5 全局函数和成员函数

  • 1、把全局函数转化成成员函数,通过this指针隐藏左操作数
Test add(Test &t1, Test &t2)  ===》  Test add(Test &t2)
  • 2、把成员函数转换成全局函数,多了一个参数
void printAB()  ===void printAB(Test *pthis)
  • 3、函数返回元素和返回引用
Test& add(Test &t2) //*this //函数返回引用
{this->a = this->a + t2.getA();this->b = this->b + t2.getB();return *this; //*操作让this指针回到元素状态
} Test add2(Test &t2) //*this //函数返回元素
{//t3是局部变量Test t3(this->a+t2.getA(), this->b + t2.getB()) ;return t3;
}

代码示例:

#include <iostream>using namespace std;class Test
{friend void show(Test &t);   //声明友元函数
private:int a;
public:Test(){a = 100;}void show(){cout << this->a << endl;}
};void show(Test &t)  //成员函数改成全局函数  需要添加一个参数
{//cout << a << endl;  //a是成员变量 通过对象来访问(这里会报错)cout << t.a << endl;   //友元函数可以访问类的私有成员变量
}int main()
{Test t1;t1.show();show(t1);return 0;
}

运行结果:
在这里插入图片描述

7.3 友元

7.3.1 友元函数

友元函数不是类的内部函数,是一个全局函数,但是可以改变类的私有属性
友元函破坏了类的封装性
在这里插入图片描述
在这里插入图片描述

7.3.2 友元类

若B类是A类的友员类,则B类的所有成员函数都是A类的友员函数
友员类通常设计为一种对数据操作或类之间传递消息的辅助类
在这里插入图片描述
示例代码:

#include <iostream>using namespace std;class A
{friend class B;   //友元类  可以在类B中访问类A的私有成员变量
private:int a;
};class B
{
public:void print(A &ta){cout << ta.a << endl;}
};int main()
{return 0;
}

相关文章:

C++回顾(七)—— 面向对象模型

7.1 静态成员变量和静态成员函数 7.1.1 静态成员变量 关键字 static 可以用于说明一个类的成员&#xff1b;静态成员提供了一个同类对象的共享机制&#xff1b;把一个类的成员说明为 static 时&#xff0c;这个类无论有多少个对象被创建&#xff0c;这些对象共享这个 static …...

开源监控服务uptime-kuma

好久没写文章了&#xff0c;刚好最近用了一个开源的监控服务&#xff0c;感觉蛮有意思的&#xff0c;记录一下 &#xff08;一&#xff09;安装 uptime-kuma安装方式有几种&#xff0c;这里当然是选择大家都爱的docker,一条命令搞定 docker run -d --restartalways -p 3001:…...

JavaScript混淆技术:了解其核心原理和常用手段

当今互联网时代&#xff0c;JavaScript已经成为了web前端开发的重点技术之一。其中&#xff0c;JavaScript代码的安全性问题一直是关注的焦点。为了保护JavaScript代码的安全性&#xff0c;很多人对其进行加密处理&#xff0c;众所周知&#xff0c;对于单纯的加密算法&#xff…...

大型医院云HIS系统:采用前后端分离架构,前端由Angular语言、JavaScript开发;后端使用Java语言开发 融合B/S版电子病历系统

一套医院云his系统源码 采用前后端分离架构&#xff0c;前端由Angular语言、JavaScript开发&#xff1b;后端使用Java语言开发。融合B/S版电子病历系统&#xff0c;支持电子病历四级&#xff0c;HIS与电子病历系统均拥有自主知识产权。 文末卡片获取联系&#xff01; 基于云计…...

SAP UI5 Upload/Download file through NetWeaver Gateway

1、创建 SEGW对象 2、创建Entity Type 要把Media 标识打上 3、 激活对象然后到DPC Class的扩展对象里面重定义 /IWBEP/IF_MGW_APPL_SRV_RUNTIME~GET_STREAM /IWBEP/IF_MGW_APPL_SRV_RUNTIME~CREATE_STREAM /IWBEP/IF_MGW_APPL_SRV_RUNTIME~UPDATE_STREAM METHOD /iwbep/if_m…...

opencv校正图像

目录1、前言2、例程2.1、代码2.2、效果口罩说明书网页3、按步骤分析转灰度图降噪 Canny边缘检测膨胀&#xff08;可视具体情况省略&#xff09;轮廓检索选取角度1、前言 我们用相机拍照时&#xff0c;会因为角度问题造成拍歪&#xff0c;会影响图像的识别&#xff0c;这时就需…...

JavaScript:函数与箭头函数的区别

ref 1. 定义 函数 function getName() {}箭头函数 const getName () > {}2. 命名 函数分为匿名、具名。 function getName() {} let getName function () {}箭头函数只有匿名。 const getName () > {}3. 构造函数 箭头函数都是匿名函数&#xff0c;所以不能作为构造…...

八股文(四)

目录 一、 Vue2的双向数据绑定原理 二、 vue2数据绑定缺点是什么&#xff1f;vue3是怎么解决的&#xff1f; &#xff08;1&#xff09;因为vue2.0 object.defineProperty只能劫持对象属性 &#xff08;2&#xff09;Proxy是直接代理对象 &#xff08;3&#xff09;proxy不…...

XSS挑战赛(xsslabs)1~10关通关解析

简介 XSS挑战赛&#xff0c;里面包含了各种XSS的防御方式和绕过方式&#xff0c;好好掌握里面的绕过细节&#xff0c;有助于我们更好的去发现XSS漏洞以及XSS的防御。本文更多的是分享解析的细节&#xff0c;不是一个标准的答案&#xff0c;希望大家在渗透的时候有更多的思维。…...

什么是以太网供电POE

POE指的是以太网供电&#xff0c;就是一根网线在传输网络的同时还传输设备所需的电源。我们最常见的就是通过POE交换机连接网络摄像头&#xff0c;网络摄像头无需的电源适配器&#xff0c;仅靠一根网线就能实现电源和网络的传输。POE供电一般可以到100米。POE包含两个部分&…...

【JUC2022】第七章 AQS、ReentrantReadWriteLock 和 StampedLock

【JUC2022】第七章 AQS 文章目录【JUC2022】第七章 AQS一、AQS1.概述2.同步器3.抽象的4.队列式二、ReentrantReadWriteLock1.概述2.案例3.存在的问题三、StampedLock1.概述2.案例3.存在的问题一、AQS 1.概述 AQS(AbstractQueueSynchronizer&#xff0c;抽象的队列式同步器)&am…...

Spark 磁盘作用

Spark 磁盘作用磁盘作用性能价值失败重试ReuseExchangeSpark 导航 磁盘作用 临时文件、中间文件、缓存数据&#xff0c;都会存储到 spark.local.dir 中 在 Shuffle Map 时&#xff0c; 当内存空间不足&#xff0c;就会溢出临时文件存储到磁盘上溢出的临时文件一起做归并计算…...

三、Spark 内存管理

文章目录Spark 内存管理堆内和堆外内存堆内内存堆外内存堆外与堆内的平衡内存空间分配静态内存管理&#xff08;早期版本&#xff09;统一内存管理Spark 内存管理 堆内和堆外内存 Spark 引入了堆外&#xff08;Off-heap&#xff09;内存&#xff0c;使之可以直接在工作节点的…...

Java 面试常见项目问题回答

之前整理了好几期&#xff0c;我面试时遇到的面试候选人&#xff0c;我是如何我去筛选的&#xff0c;这一期&#xff0c;我们来看下一些 面试常问的业务性的问题 你们公司权限认证是如何实现的? 这其实是个通用性的问题&#xff0c;大部分公司 小型公司&#xff0c;或者中型公…...

文件上传和下载(原生JS + SpringBoot实现)

目录 概述 前端编写-上传表单和图片回显 HTML表单代码 发送请求逻辑 CSS代码 后端编写-文件上传接口 后端编写-文件下载接口 概述 在现代Web应用程序中&#xff0c;文件上传和下载是常见的功能。本博客将介绍如何使用原生JS和Spring Boot实现文件上传和下载的功能。 在其…...

【C语言学习笔记】:安全性

用const修饰变量或方法&#xff0c;从而告诉编译器这些都是不可变的&#xff0c;有助于编译器优化代码&#xff0c;并帮助开发人员了解函数是否有副作用。此外&#xff0c;使用const &可以防止编译器复制不必要的数据。John Carmack对const的评论[2]值得一读。 // Bad Ide…...

Linux - 磁盘存储管理 磁盘引入

# 我们要介绍下 磁盘管理&#xff0c; 那不妨先来看一张图来简单 引入 &#xff1a;这张图呢&#xff0c;是我们 Windows 上的磁盘管理的显示 。根据这幅图呢&#xff0c;提出一个问题 &#xff1a;>>> 这幅图磁盘管理所显示的内容&#xff0c;你能判断出 该电脑 有几…...

分割std::string成多个string

文章目录问题描述前置知识解决代码问题描述 假设我们有一个http服务器&#xff0c;此服务器接收客户端发来的http请求&#xff0c;假设请求如下 GET / HTTP/1.1我们怎么将这个Http请求分割成三份&#xff0c;分别存入不同的string中分别处理? 前置知识 首先std::string的本…...

3月多国更新进出口产品规定

【3月多国更新进出口产品规定】2023年3月多项外贸新规实施&#xff0c;涉及欧盟&#xff0c;伊拉克&#xff0c;泰国&#xff0c;孟加拉国&#xff0c;埃及等多国进出口产品限制及海关税则。1. 3月1日起给予埃塞俄比亚等三国98%税目产品零关税待遇中国国务院关税税则委员会17日…...

nacos相关面试题

Nacos是阿里巴巴开源的一款注册中心和配置中心&#xff0c;它能够实现服务的注册、发现和配置管理等功能。Nacos的实现原理主要分为以下几个部分&#xff1a;注册中心&#xff1a;Nacos作为注册中心&#xff0c;通过提供RESTful API的方式对外提供注册和发现服务。它使用基于Ra…...

Power BI 网页数据抓取实战:以新浪外汇为例,教你5分钟搞定动态表格导入与清洗

Power BI 网页数据抓取实战&#xff1a;新浪外汇动态表格导入与清洗全流程解析 外汇市场瞬息万变&#xff0c;作为业务分析师&#xff0c;每天手动记录汇率数据既耗时又容易出错。今天我们就以新浪财经外汇数据为例&#xff0c;手把手教你用Power BI实现5分钟自动化抓取清洗的完…...

如何将 iQOO 手机备份到Mac

iQOO是vivo旗下的智能手机品牌&#xff0c;以其强劲的性能、出色的游戏体验和极具竞争力的价格而闻名。它深受那些希望以合理价格购买高性能Android手机的用户欢迎。然而&#xff0c;由于缺乏官方的 macOS 管理工具&#xff0c;许多用户发现将 iQOO 手机备份到Mac并非易事。幸运…...

基于摄像头和网络的火灾监测系统开源项目推荐

推荐的开源项目 基于YOLOv10的火焰烟雾检测系统&#xff08;最推荐&#xff09; 特点&#xff1a;支持图像、视频和摄像头实时检测&#xff0c;提供完整的GUI界面&#xff08;PySide6开发&#xff09;优势&#xff1a;界面简洁易用&#xff0c;代码结构清晰&#xff0c;适合初学…...

双轴光伏智能跟踪系统,怎么让光伏发电效率提上来的?

做光伏相关开发和落地的朋友&#xff0c;应该都绕不开一个核心痛点&#xff1a;传统固定式光伏的光能利用率&#xff0c;一直有明显的天花板。今天就用通俗的方式&#xff0c;拆解WZ HELIO这套双轴智能跟踪系统&#xff0c;看看它是怎么解决这个行业老问题的。先搞懂核心逻辑&a…...

从旅游Vlog到新闻视频:QVHIGHLIGHTS数据集在跨领域应用中的实战指南

QVHIGHLIGHTS数据集&#xff1a;跨领域视频内容智能解析的工程实践 当你在旅行Vlog中搜索"日落时分的海滩漫步"&#xff0c;或在新闻视频中寻找"抗议活动现场冲突画面"&#xff0c;传统视频平台只能返回整段视频——这就像给你一整本书而不是精确的页码。Q…...

PROJECT MOGFACE与Dify平台集成:快速构建无需编码的AI智能体应用

PROJECT MOGFACE与Dify平台集成&#xff1a;快速构建无需编码的AI智能体应用 最近在折腾AI应用开发的朋友&#xff0c;可能都有过类似的烦恼&#xff1a;手头有一个效果不错的模型&#xff0c;比如我们团队部署的PROJECT MOGFACE&#xff0c;想把它变成一个能对外服务的、功能…...

5个认知重构,收割你的补偿性Offer

春招反杀指南当别人还在为秋招失利懊悔时&#xff0c;聪明人已经完成了思维系统的彻底升级秋招的硝烟尚未散尽&#xff0c;春招的号角已经吹响。这不是简单的“第二轮机会”&#xff0c;而是认知层面的降维打击战。那些在秋招中凭借简历光环轻松通关的路径已然失效&#xff0c;…...

foobar2000界面美化终极指南:3步打造你的专属音乐播放器

foobar2000界面美化终极指南&#xff1a;3步打造你的专属音乐播放器 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 还在为foobar2000那套单调乏味的默认界面感到困扰吗&#xff1f;今天我要为你介绍…...

从信任根到信任链:构建坚不可摧的数字信任体系

1. 信任根&#xff1a;数字世界的安全基石 想象一下你正在建造一座摩天大楼。无论设计多么精妙&#xff0c;如果地基不牢固&#xff0c;整栋建筑都可能坍塌。在数字安全领域&#xff0c;**信任根&#xff08;Root of Trust, RoT&#xff09;**就是这样的地基。它是一个密码系统…...

LoRA训练助手入门解析:为什么权重排序对LoRA训练效果影响显著

LoRA训练助手入门解析&#xff1a;为什么权重排序对LoRA训练效果影响显著 1. 认识LoRA训练助手 如果你正在尝试训练自己的AI绘画模型&#xff0c;可能会遇到一个常见问题&#xff1a;为什么同样的图片&#xff0c;用不同的标签训练出来的效果差距那么大&#xff1f;这就是我们…...