当前位置: 首页 > 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…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...