c++之旅——第六弹

大家好啊,这里是c++之旅第六弹,跟随我的步伐来开始这一篇的学习吧!

如果有知识性错误,欢迎各位指正!!一起加油!!

创作不易,希望大家多多支持哦!

一,静态成员:

1.静态成员是什么:

静态成员可以在类的所有对象之间共享数据,也可以提供不依赖于类的对象的操作。静态成员是在类的整个生命周期中存在的

静态成员在全局静态常量区,全局静态常量区的数据在程序一开始就有,在程序结束时才死亡;而栈区和堆区的生命周期却是暂时性的,比较短

2.静态成员定义方式:

静态成员,指的是在C++类中声明成员时,可以加上static关键字,这样声明的成员叫静态成员

3.静态成员的分类:

静态成员分为静态数据成员和静态函数成员两种

(1)静态数据成员:(示例代码)

class node
{
public:
static int id;// 静态数据成员定义
};
int node::id=10;// 不管是什么访问属性,静态数据成员都是在类外初始化

静态数据成员的特点:

①、只会被定义一次,所有对象共享这个数据

②、不管是什么访问属性都是在类中声明,类外初始化

③、如果是公有访问属性,那么可以类外直接通过 类名 :: 静态数据成员 访问

④ 、构造函数里面可以重新赋值,在其他函数中是不可以进行修改的

(2)静态函数成员:

class node
{public:static void fun(){}// 在类中定义static void fun1();// 类中声明
};
void node::fun1()
{
}
// 在类外定义

静态函数成员的特点:

①、访问和静态数据成员一样,并且使用是在类中声明,在类外进行定义

②、静态函数成员中不能访问类中的普通成员,可以访问静态成员

③、静态函数成员中可以使用局部变量,形参,静态成员

4.静态成员的使用场景:

(1)、共享数据:静态成员可以用于存储所有类的实例之间共享的数据。

(2)、全局数据:静态成员可以被视为类的全局变量。可以在整个程序中访问静态成员,不需要创建类的实例。

(3)、类方法:静态成员函数不依赖于类的实例,因此它们可以用于执行与特定对象无关的操作。静态成员函数通常用于执行与类相关的全局任务或操作。

5.static的五种用法:

1、修饰局部变量,使用在局部,生命周期在全局(全局是在整个项目中)

2、修饰全局变量,该变量只能使用在本文件,生命周期在全局(不修饰则是使用在全局了)

3、修饰普通函数,该函数只能使用在本文件(不修饰则是使用在全局了)

4、修饰类中成员数据,数据被所有对象共享

5、修饰类中成员函数,该成员函数只能访问类中静态成员数据、局部变量和形参

//额外知识点:

类的大小的计算:一个类如果成员是空的,那么其大小为一个字节,用来表示这是一个类,如果其中有成员,则按照成员来计算其大小,计算方式和结构体是一致的,这时它的大小就不需要加上用来表示它是类的那一个字节了.静态成员不属于类中的成员,而是在该类唯一所对应的共享空间中,那么也就会导致当一个类中只有静态成员时,该类的大小是一个字节(定义类时如果里面没有数据成员,其大小就是一个字节),同时因为这个共享性,才导致类中的静态成员无论什么访问属性都可以在类外进行初始化,友元函数也不属于类,和静态成员是一个意思(在后面会讲到友元函数) ​

二,常量成员:

1.常量成员介绍:常量成员,指的是在 C++ 类中声明对象成员时可以加上 const 关键字

2.常量成员分为常量数据成员和常量函数成员,都具有常量的特点不可以修改 ( 只读 )

(1)常量数据成员:

class node
{
const int id;
const int age=18;
// 不建议
};
//如果要初始化常量数据成员,
//一般只能通过初始化列表初始化
​
//改进:
class node
{
const int id;
int age;
node(int x):id(x),age(18)//id 的值初始化为 x ,age 初始为 18,可以给常量和普通成员进行初始化
{
}
//CMyStu::CMyStu(int i, char s) :sex(s),id(i)//常量成员初始化列表的带参初始化方式
};

常量的初始化:在类中直接赋值,但是是新写法,在老版本的编译器中可能会报错,所以想使用另一种初始化方式:借鉴静态成员的初始化方式,我们在类外进行常量成员的初始化,但是这样写会报错,因为相当于在类中声明了一次常量成员,在类外初始化时相当于进行了第二次声明,这样就会报错。所以使用成员初始化列表方式来进行初始化常量成员 ,常量成员只能在成员初始化列表中进行初始化;同时成员初始化列表可以初始化一般数据成员。

但是成员初始化列表可以进行初始化的话,那要构造函数进行初始化干什么?

①因为初始化列表是伴随在构造函数后面的,如果有多个构造函数,那对常量成员的初始化就需要在每个构造函数后面写(如果有定义和声明,在定义后面写即可),这是因为每一个构造函数都可能被使用。

②因为成员初始化列表只能初始化类对象的数据成员,而对成员函数无法进行调用,而构造函数就可以在里面写上这个普通成员函数来进行调用,这一点是成员初始化列表所做不到的,但是成员初始化列表可以对构造函数进行调用

(2)常量函数成员:

class node
{
int id=10;
public:
void fun()const // 注意 const 是写在函数的后面不是前面
{
id=10;// 报错
}
void fun1()const;// 类内声明
};
void node::fun1()const// 类外实现
{}
// 在这个函数中,不能修改类中的数据成员

(3)常量对象:

①、在对象实例化的时候在类名前面加上 const 修饰,该对象为常量对象,满足常量的操作,定义时必须初始化。

②、该对象里面的所有数据都不能被修改。因此对象里面的普通成员函数不允许被调用(防止改变数据),只允许调用常量函数成员

3.初始化列表注意事项:

初始化列表的初始化顺序是按照他们在类中出现的顺序来初始化的,而不是在初始化列表中写的顺序来初始化的

4.使用场景:

(1)、不可修改的数据:常量成员变量用于存储在类的实例中不可更改的数据。这些常量可以是类的特定值,或者是在类的构造函数中初始化的无需修改的数据。

(2)、数据保护和封装:通过将某些成员变量声明为常量,可以防止它们被意外修改。这有助于提高类的安全性和封装性,确保只有类的特定方法才能修改数据。

(3)、优化和性能:常量成员变量可以在编译时被优化。由于这些变量的值是固定的,编译器可以在必要时直接将其替换为对应的常量值,从而改善代码的性能。

(4) 、类的接口:常量成员函数表示这些函数不会修改任何类的成员变量。这样的函数可以被其他部分(包括常量对象和常量成员函数)使用,从而增加类的灵活性和可重用性。

(5)、强制性的函数语义:声明成员函数为常量成员函数可以强制函数在不修改类的状态的情况下执行操作。以确保函数不会产生意外的副作用导致类中不可修改的常量成员被修改。

三,友元成员: 类的特性之一就是封装,而友元打破这种封装的方式,友元分为友元函数和友元对象:

1.综述:

(1)友元函数,他只是一个函数,友元函数不是类的成员,通过类对象是无法访问的,但是在这个函数中有权通过对象访问类中的所有成员。

(2)友元函数,无论声明在类中的任访问属性下都可以,不影响他的调用和访问

(3)友元类是一个单独的类,和友元函数一样,在类中声明了一个友元类,在这个友元类中同样也可以访问该类中的所有成员

2.友元函数:

class node
{int id=10;friend void fun(node& n);// 声明
}
// 定义函数,需要有类对象
void fun(node&n)
{cout<<n.id<<enl;
}
//调用:
node n;
fun(n);//输出 10

3.友元类:

class A
{
friend classB;// 声明
int id;
};
class B
{
public:
void fun(A & a)//当调用该函数的时候会访问到A的私有id
{
cout<<a.id<<endl;
}
}
 

4.友元的特点:

(1)、单方向:B是A的朋友,B可以访问A的数据,A不可以访问B的数据。

(2)、不传递:A是B的朋友,B是 C 的朋友,A和 C没有朋友关系

(3)、不继承:A是B的朋友,B是 C 的父亲,A和 C没有关系(派生类)

5.使用场景:

(1)、访问私有成员:友元成员可以访问被声明为友元的类的私有成员。这样可以在需要直接访问私有成员的情况下,避免使用公有接口,减少函数调用开销。

(2)、维护类的封装性:正常情况下,类的私有成员只能被该类的成员函数访问。但有时需要让其他类或函数能够访问私有成员,以实现特定的功能。友元成员可以提供这种特权访问,同时仍然保持了类的封装性。

(3)、实现运算符重载:在运算符重载中,有时需要访问不同类的私有成员。通过将一个类的成员函数声明为另一个类的友元成员,可以实现对私有成员的直接访问,并且能够在运算符重载内部进行操作。

(4) 、提升效率:有时,为了提高性能,需要直接访问类的私有成员,而不是通过公有接口。友元成员提供了一种有效的方式,避免了公有接口的调用开销。

6.细节注意:

写友元成员时一般类中进行声明,类外进行定义,定义时无需在前面加上类作用域

(eg:a::),因为友元成员不属于类(而静态成员需要,这就说明友元成员是比静态成员不属于类的层次更上一层的。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode(力扣)算法题_1261_在受污染的二叉树中查找元素

今天是2024年3月12日&#xff0c;可能是因为今天是植树节的原因&#xff0c;今天的每日一题是二叉树&#x1f64f;&#x1f3fb; 在受污染的二叉树中查找元素 题目描述 给出一个满足下述规则的二叉树&#xff1a; root.val 0 如果 treeNode.val x 且 treeNode.left ! n…

【PLC】现场总线和工业以太网汇总

1、 现场总线 1.1 什么是现场总线 1&#xff09;非专业描述&#xff1a; 如下图&#xff1a;“人机界面”一般通过以太网连接“控制器(PLC)”&#xff0c;“控制器(PLC)”通过 “现场总线”和现场设备连接。 2&#xff09;专业描述&#xff08;维基百科&#xff09; 现场总线…

如何设计一个高并发的系统--简谈

设计一个高并发系统可以从下面这些角度来考虑。 所谓设计高并发系统&#xff0c;就是设计一个系统&#xff0c;保证它整体可用的同时&#xff0c;能够处理很高的并发用户请求&#xff0c;能够承受很大的流量冲击。 我们要设计高并发的系统&#xff0c;那就需要处理好一些常见…

安装及管理docker

文章目录 1.Docker介绍2.Docker安装3.免sudo设置4. 使用docker命令5.Images6.运行docker容器7. 管理docker容器8.创建image9.Push Image 1.Docker介绍 Docker 是一个简化在容器中管理应用程序进程的应用程序。容器让你在资源隔离的进程中运行你的应用程序。类似于虚拟机&#…

Linux -- 线程互斥

一 线程互斥的概念 大部分情况&#xff0c;线程使用的数据都是局部变量&#xff0c;变量的地址空间在线程栈空间内&#xff0c;这种情况&#xff0c;变量归属单个线程&#xff0c;其他线程无法获得这种变量。但有时候&#xff0c;很多变量都需要在线程间共享&#xff0c;这样的…

淘宝基于Nginx二次开发的Tengine服务器

最近在群里看到这样一张阿里云网关报错的截图&#xff0c;我保存下来看了下 看到下面有 Tengine提供技术支持&#xff0c;这个Tengine是什么东西呢&#xff1f;我搜索了下似乎是淘宝在nginx的基础上自己改的Web服务器 Tengine还支持OpenResty框架&#xff0c;该框架是基于Ngin…

ARM中专用指令(异常向量表、异常源、异常返回等)

状态寄存器传送指令 CPSR寄存器 状态寄存器传送指令:访问&#xff08;读写&#xff09;CPSR寄存器 读CPSR MRS R1, CPSR R1 CPSR 写CPSR MSR CPSR, #0x10 0x10为User模式&#xff0c;且开启IRQ和FRQ CPSR 0x10 在USER模式下不能随意修改CPSR&#xff0c;因为USER模式…

BUUCTF-----[CISCN 2019 初赛]Love Math

<?php error_reporting(0); //听说你很喜欢数学&#xff0c;不知道你是否爱它胜过爱flag if(!isset($_GET[c])){show_source(__FILE__); }else{//例子 c20-1$content $_GET[c];if (strlen($content) > 80) {die("太长了不会算");}$blacklist [ , \t, \r, \n…

【Android】工厂模式中 字体大小/显示重叠/显示不完整 相关 问题分析与解决

工厂模式中 字体大小/显示重叠/显示不完整 相关 问题分析与解决 1-Factory Mode是什么&#xff1f;2-Factory Mode的显示界面3-找到factory模块中对应设置字体尺寸的代码4-分析与修改代码 Tips 1-Factory Mode是什么&#xff1f; 在Android手机中&#xff0c;Factory Mode&…

Seata 2.x 系列【8】Spring Cloud 集成客户端

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Seata 版本 2.0.0 本系列Spring Boot 版本 3.2.0 本系列Spring Cloud 版本 2023.0.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 前言2. 问题演…

零基础如何学习Web 安全,如何让普通人快速入门网络安全?

前言 网络安全现在是朝阳行业&#xff0c;缺口是很大。不过网络安全行业就是需要技术很多的人达不到企业要求才导致人才缺口大 初级的现在有很多的运维人员转网络安全&#xff0c;初级也会慢慢的卷起来&#xff0c;但是岗位多不用怕&#xff0c;以后各大厂也都会要网络安全人…

读西游记第一回:西游记世界格局

天地之数&#xff1a; 元&#xff1a;十二万九千六百岁&#xff08;129600年&#xff09; 1元12会&#xff1a;子、丑、寅、卯、巳、午、未、申、酉、戌、亥。每会18000年。与12地支对应。 亥会期&#xff1a;前5400年混沌期&#xff0c;后5400年&#xff0c;盘古开天辟地&am…

YOLOv9改进项目|关于本周更新计划的说明24/3/12

目前售价售价59.9&#xff0c;改进点30个 专栏地址&#xff1a; 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 日期&#xff1a;24/3/12 本周更新计划说明&#xff1a; 1. 更新华为Gold YOLO中的…

【nodejs】“__dirname is not defined”错误修复

▒ 目录 ▒ &#x1f6eb; 问题描述环境 1️⃣ 原理CommonJS vs ESM错误原因 2️⃣ 禁用 ESM 模式并改用 CommonJS方案一&#xff1a;项目方案二&#xff1a;单文件 3️⃣ 在 ESM 模式下自实现__dirname&#x1f4d6; 参考资料 &#x1f6eb; 问题 描述 从网上找了一份代码&am…

链表基础知识详解(非常详细简单易懂)

概述&#xff1a; 链表作为 C 语言中一种基础的数据结构&#xff0c;在平时写程序的时候用的并不多&#xff0c;但在操作系统里面使用的非常多。不管是RTOS还是Linux等使用非常广泛&#xff0c;所以必须要搞懂链表&#xff0c;链表分为单向链表和双向链表&#xff0c;单向链表很…

【四】【算法分析与设计】贪心算法的初见

455. 分发饼干 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#xff0c;都有…

提高螺栓连接强度——SunTorque智能扭矩系统

螺栓连接是工程中常见的一种连接方式&#xff0c;其强度对于设备的稳定性和安全性具有至关重要的影响。然而&#xff0c;由于各种因素的影响&#xff0c;螺栓连接在使用过程中往往会出现松动、断裂等问题&#xff0c;导致设备故障和安全隐患。因此&#xff0c;提高螺栓连接的强…

Kanebo HITECLOTH 高科技擦镜布介绍

Kanebo HITECLOTH&#xff0c;这款由日本KBSeiren公司制造的高科技擦镜布&#xff0c;以其卓越的清洁能力和超柔软的布质&#xff0c;成为了市场上备受瞩目的产品。 材质与特性 HITECLOTH采用0.1旦尼尔特级高级微纤维制造&#xff0c;质地细致、坚韧、不起颗粒。这种纤维的特…

利用HubSpot出海CRM和人工智能技术提升出海业务的效率和效果

在当今数字化时代&#xff0c;智能化营销已经成为企业获取客户和扩大市场份额的关键策略。特别是对于出海业务而言&#xff0c;利用智能化营销技术来应对不同文化、语言和市场的挑战&#xff0c;已经成为企业竞争的关键优势。今天运营坛将带领大家探讨如何利用HubSpot CRM和人工…

网络流量监控软件AnaTraf:优化性能、排除故障的最佳选择

目录 导言 网络流量监控的重要性 AnaTraf网络万用表的功能与优势 网络故障排除与优化网络性能 结论 导言 在当今数字化时代&#xff0c;计算机网络已经成为企业和组织的核心基础设施。然而&#xff0c;网络流量的管理和监控对于确保网络性能的稳定和优化至关重要。本文将介…