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

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...