【C++】从入门到精通第三弹——友元函数与静态类成员
这里写目录标题
- 静态类成员
- 友元
- 友元方法
静态类成员
类成员一般都需要通过对象来访问,不可以通过类名直接访问,但是当我们将类成员定义为静态类成员,则允许使用类名直接访问。
静态类成员是在类成员前定义static关键字。
1 #include<iostream>2 using namespace std;3 class Cbook4 {5 public:6 static int price;7 };8 int Cbook::price = 410;9 int main()10 {11 Cbook cbook;12 cout<<"Cbook in"<<Cbook::price<<endl; //通过类名直接访问类成员13 cout<<"Cbook use"<<cbook.price<<endl;//通过对象访问静态类成员14 15 16 return 0;17 }
注意:在定义静态类成员时,通常需要在类体外部对静态类成员进行初始化。
静态类成员是被所有的类共享的,无论定义多少个类对象。类的静态类成员只有一份,同时,如果一个对象修改了静态类成员,那么其他对象的静态类成员也将改变(修改的是同一个静态类成员)
静态类成员可以是当前类的类型,其他数据类成员只能是当前类的指针或应用类型,在定义类成员时,对于静态类成员,其类型可以是当前类的类型,而非静态类·成员则不可以,除非数据成员的类型为当前类的指针或引用类型。
8 class CBOOK9 {10 public:11 static int price;12 // CBOOK cbook;错误,非法定义13 static CBOOK cook;14 CBOOK *cbook;15 };
静态类成员可以作为成员函数的默认参数,在定义类的成员函数时,可以为成员函数指定默认参数,其参数的默认值也可以是类的静态类成员,但是不同的数据成员不能作为成员函数的默认参数。
类的静态成员函数只能访问类的静态成员,而不能访问普通的数据成员。
而且静态类成员函数不能定义为const成员函数,如果函数的实现代码位于类体之外,则在函数的实现部分不能再标识static关键字。
友元
友元概述
友元是使用friend关键字, 让特定的函数或者别的类的所有成员函数对私有数据成员进行读写。
好处是:可以保持数据的私有性,又可以让特定的类或者函数直接访问私有成员。
为了提升效率,友元可以让普通函数直接访问一个类的保护或私有数据成员,但是如果没有友元机制,就只能将类的数据成员声明为公共的,从而任何函数都可以无约束地访问它。
友元函数:
1 #include<iostream>2 using namespace std;3 class Friendfunction4 { 5 public:6 Friendfunction()7 {8 m_height = 0;9 m_width = 0;10 }11 Friendfunction(int height,int width)12 {13 m_width = width;14 m_height = height;15 }16 int getHeight()17 {18 return m_height;19 }20 int getWidth()21 {22 return m_width;23 }24 friend int friendfunction(Friendfunction &myret);25 protected:26 int m_height;27 int m_width;28 };29 int friendfunction(Friendfunction &myret)30 {31 return myret.m_height*myret.m_width;32 }33 int main()34 {35 Friendfunction ff(120,210);36 cout<<"result = "<<friendfunction(ff)<<endl;37 38 return 0;39 }
在函数friendfunction中可以直接使用Friendfunction类对象中的数据成员,就是因为第24行代码的作用:
24 friend int friendfunction(Friendfunction &myret);
此例子既很好的保护隐藏了数据,又可以使外界的特定函数直接访问这些隐藏数据。
接下来介绍友元类:
就如下面第14行代码所示 : friend class Clist; 就可以声明友元类啦。用法和功能与友元函数用法功能类似。这里就不再详细赘述了,直接看代码:
1 #include<iostream>2 #include<string>3 using namespace std;4 class Cltem5 {6 private:7 string m_name;8 void outputname()9 {10 cout<<"name = "<<m_name<<endl;11 12 }13 public:14 friend class Clist;15 void setltemname(string name)16 {17 m_name= name;18 } 19 }; 20 class Clist21 {22 private:23 Cltem m_ltem;24 public:25 void outoutltem();26 };27 void Clist::outoutltem()28 {29 m_ltem.setltemname("beijing");30 m_ltem.outputname();31 }32 int main()33 {34 Clist list;35 list.outoutltem();36 37 return 0;38 }
定义Cltem类时,使用了friend关键字将Clist类定义为Cltem类 的友元,这样一来,Clist类中的所有方法都可以访问Cltem类中的私有成员了。
友元方法
在我们真正开发程序时,有时候需要控制一个类对当前类的私有成员的发法。比如,我们需要实现只允许Cbook类中的某个成员来访问·Clibrary类的私有成员,而不允许其他成员函数访问Clibrary类的私有数据,这可以通过定义友元函数来实现。在定义Clibrary类的时候,可以将Cbook类的某个方法定义为友元方法,这样就限制了只有该方法允许访问Clibrary类的私有成员。
1 #include<iostream>2 using namespace std;3 class Clibrary;4 class Cbook5 {6 public:7 Cbook();8 ~Cbook();9 Clibrary *position;10 void putcbook(); //声明友元11 //void notfriendcbook();//不声明友元,作为对比12 };13 class Clibrary14 {15 friend void Cbook::putcbook();16 private:17 string name;18 void putname()19 {20 cout<<"name = "<<name<<endl;21 }22 public:23 void setname(string name);24 };25 void Clibrary::setname(string name)
26 { 27 this->name = name;28 }29 void Cbook::putcbook()30 { 31 position->setname("beijing");32 position->putname();33 } /*34 void Cbook::notfriendcbook()35 {36 position->setname("beijing");37 position->putname();38 }*/39 Cbook::Cbook()40 {41 position = new Clibrary();42 }43 Cbook::~Cbook()44 {45 delete position;46 position = NULL;47 }48 49 int main()50 {51 Cbook cook;52 cook.putcbook();53 54 // cook.notfriendcbook();55 return 0;56 }
就像上面代码所示,如果把没有声明友元的成员函数放开,就会出现下面这样的错误。
[bsk@localhost c++]$ g++ friendmethod.cpp
friendmethod.cpp: In member function ‘void Cbook::notfriendcbook()’:
friendmethod.cpp:18:10: error: ‘void Clibrary::putname()’ is privatevoid putname()^
friendmethod.cpp:37:23: error: within this contextposition->putname();
原因也很简单,就是因为notfriendcbook()成员函数不是Clibrary类的友元,所以这个成员函数就不能访问去访问Clibrary类中的私有属性。
此外,全局函数也可以作为类友元,一样可以访问类中的私有成员。
最后简单来谈一下
友元函数在访问类对象中的成员时,不需要通过对象名。友元函数没有this指针,如果不通过对象名就无法找到类对象中的非static成员,也就无法访问。但是当访问类对象中的static成员时,就可以不用通过对象名访问。
相关文章:
【C++】从入门到精通第三弹——友元函数与静态类成员
这里写目录标题 静态类成员友元友元方法 静态类成员 类成员一般都需要通过对象来访问,不可以通过类名直接访问,但是当我们将类成员定义为静态类成员,则允许使用类名直接访问。 静态类成员是在类成员前定义static关键字。 1 #include<iost…...
acwing算法基础之搜索与图论--floyd算法
目录 1 基础知识2 模板3 工程化 1 基础知识 floyd算法的时间复杂度为O(n^3),它用来解决多源最短路问题。它的原理是基于动态规划。 floyd算法的关键步骤: k从1到n。i从1到n。j从1到n,d[i][j] min(d[i][j], d[i][k] d[k][j])。经过上述三…...
Zabbix监控SSL证书有效期
一、介绍 由于业务需要,最近通过 Let’s Encrypt 申请了一些 SSL 证书,而证书有效期为 3 个月,需要在证书到期之前 renew。由于域名较多经常忘记 renew,导致证书过期,因此想通过 Zabbix 的方式监控证书的到期时间&…...
Arduino OneButton按键处理库实现单击/双击/长按功能
Arduino OneButton按键处理库实现单击/双击长按功能 ✨在Arduino开发平台下,按键的单击/双击/长按功能,在通过使用OneButton库,很容易就可以轻松实现。这就是支持C/C模块化设计的好处,避免重复性开发的工作。 🔖本文将…...
day52 django的下载与安装
课程的大致安排 大概两周的时间都是围绕着Django框架的学习,包括后续要学习的drf、Redis、celery、es等技术栈都是围绕Django展开的,因此、要求所有的同学必须认证学习了 市场中所有使用Python开发的web项目,Django框架占有率达到90%以上 …...
WebGL智慧城市软件项目
WebGL开发智慧城市项目时,需要考虑多个方面,包括技术、隐私、安全和可持续性。以下是一些需要注意的关键问题,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.隐私和数据安全…...
VMware重装后没有虚拟网卡
我重装VMware之后网络适配器里面没有虚拟网卡,找了CSDN上很多博主说的,都没用。 最终去看了b站的up视频就成功了。 原因是因为第一次安装后卸载不干净,软件在电脑上的注册表没有删掉。 要用下面两个软件清理一下残留文件,这两个…...
软件安全基础
传参基础 64位汇编传参,当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。 当参数为7个以上时, 前 6 个与前面一样, 但后面的依次从 “右向左” 放入栈中,即和32位汇编一样。 我们这边要利用wr…...
探索项目管理软件的多重用途和益处
项目管理软件俨然成了当下项目管理话题中的热门词条,作为一个辅助性管理工具,项目管理软件有什么用?真的值得购入吗? 什么是项目管理软件 顾名思义,项目管理软件就是指在项目管理过程使用的各种软件工具。项目管理软件…...
Arduino ESP8266使用AliyunIoTSDK.h连接阿里云物联网平台
文章目录 1、AliyunIoTSDK简介2、相关库安装3、阿里云创建产品,订阅发布4、对开源的Arduino ESP8266源代码修改5、使用阿里云点亮一个LED灯6、设备向阿里云上传温度数据7、项目源码 1、AliyunIoTSDK简介 AliyunIoTSDK是arduino的一个库,可以在arduino的…...
【车载开发系列】AutoSar中的CANTP
【车载开发系列】AutoSar中的CANTP 【车载开发系列】AutoSar中的CANTP 【车载开发系列】AutoSar中的CANTP一. CANTP相关术语二. CANTP相关概念1)单帧:SF(Single Frame)2)首帧:FF(First Frame)3)连续帧CF(Consecutive F…...
JUL日志
文章目录 JUL日志JUL日志讲解Properties配置文件编写日志配置文件Lombok快速开启日志Mybatis日志系统 JUL日志 如果使用System.out.println来打印信息,项目中存在大量的控制台输出语句,会显得很凌乱,而且日志的粒度是不够细的,假…...
ZZ308 物联网应用与服务赛题第G套
2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 (G卷) 赛位号:______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等; 2.竞赛任务中所使用…...
如何使用 vcpkg 编译Google-V8脚本引擎(ECMA/JavaScript)?
WIN32K下一键杀死所有同名进程命令行:taskkill /F /IM chrome.exe ############################## 1、准备 Visual Studio 2019 2、准备 Visual Studio 2022 3、安装 VC、MSBuild 编译集成环境 4、安装 Python 3.x,早期V8发行版本编译安装 2.x 5、…...
系列二十二、idea Live Templates
一、idea Live Templates 1.1、Java Group 1.1.1、fast fast 快速在类上添加注解Data AllArgsConstructor NoArgsConstructor Accessors(chain true) ToString(callSuper true) 1.1.2、getThreadName getThreadName快速获取当前线程的名字Thread.currentThread().getName…...
电脑本地安装宝塔/docker 安装宝塔
一、先去docker官网(http://docker.com)下载软件并进行安装,网站打不开多试几次或者找梯子。 二、macos系统里按“command 空格”搜索“终端”回车,启动终端程序。 三、执行下面命令,拉取docker镜像。 docker pull pch18/baota:clear pch…...
Java Lambda 表达式笔记
文章目录 Java Lambda 表达式语法Lambda 表达式实例Lambda表达式与函数式接口方法引用处理lambda表达式的接口 Java Lambda 表达式语法Lambda 表达式实例Lambda表达式与函数式接口方法引用处理lambda表达式的接口 Java Lambda 表达式 Lambda 表达式,也可称为闭包. …...
Flutter笔记:状态提升、控制器模式、GetX控制器和服务
Flutter笔记 状态提升、控制器模式、GetX控制器和服务 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/1…...
9.spark自适应查询-AQE之动态调整Join策略
目录 概述动态调整Join策略原理实战 动态优化倾斜的 Join原理实战 概述 broadcast hash join 类似于 Spark 共享变量中的广播变量,Spark join 如果能采取这种策略,那join 的性能是最好的 自适应查询AQE(Adaptive Query Execution) 动态调整Join策略 原…...
CentOs7 NAT模式连接网络
1.配置动态网络 1.1 检查主机网卡配置 检查主机的网络设置 进入控制面板,找到网络共享中心 查看适配器是否都已经开启 1.2 设置虚拟机的网络配置 打开虚拟机网络配置设置,对网卡VMnet8 进行设置 记住网关 全部选择应用,确定 1.3 设置…...
Zynq UltraScale+ PL中断深度解析:从硬件连接到软件响应的完整链路
Zynq UltraScale PL中断深度解析:从硬件连接到软件响应的完整链路 在异构计算架构中,中断机制如同神经系统般连接着可编程逻辑(PL)与处理系统(PS)。当工程师需要实现微秒级实时响应或构建高可靠性系统时&am…...
再次革新 .NET 的构建和发布方式(一)蛊
本文能帮你解决什么? 1. 搞懂FastAPI异步(async/await)到底在什么场景下能真正提升性能。 2. 掌握在FastAPI中正确使用多线程处理CPU密集型任务的方法。 3. 避开常见的坑(比如阻塞操作、数据库连接池耗尽、GIL限制)。 …...
YOLO-Master 与 YOLO 开始朴
AI Agent 时代的沙箱需求 从 Copilot 到 Agent:执行能力的质变 在生成式 AI 的早期阶段,应用主要以“Copilot”形式存在,AI 仅作为辅助生成建议。然而,随着 AutoGPT、BabyAGI 以及 OpenAI Code Interpreter(现为 Advan…...
我不是在用 AI 助手,我在把自己的能力沉淀成组织资产道
1. 什么是 Apache SeaTunnel? Apache SeaTunnel 是一个非常易于使用、高性能、支持实时流式和离线批处理的海量数据集成平台。它的目标是解决常见的数据集成问题,如数据源多样性、同步场景复杂性以及资源消耗高的问题。 核心特性 丰富的数据源支持&#…...
2024年山东联通SK-D740-C光猫超级密码破解实战指南
1. 准备工作:了解SK-D740-C光猫的基本信息 山东联通SK-D740-C光猫是创维为联通定制的一款千兆光猫设备,主要用于家庭宽带接入。这款设备默认采用路由模式,由运营商远程管理,普通用户只能使用user账户登录,权限非常有限…...
终极指南:使用SRWE窗口编辑器轻松突破Windows窗口限制
终极指南:使用SRWE窗口编辑器轻松突破Windows窗口限制 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE SRWE窗口编辑器是一款专为Windows用户设计的革命性工具,让你能够实时调整任何应用程…...
Serverless 架构与实践:构建无服务器的云原生系统
Serverless 架构与实践:构建无服务器的云原生系统 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农,我深知 Serverless 架构在现代企业中的重要性。随着云技术的快速发展,传统的服务器架构已经难以满足按需使用和自动伸缩的需求。今天&…...
从理论到实践:基于MATLAB comm.RayTracingChannel的室内多径信道仿真全解析
1. 室内多径信道建模的核心挑战 想象一下你在会议室用手机视频通话时突然画面卡顿——这很可能就是多径效应在作祟。当无线信号在室内遇到墙壁、家具等障碍物时,会产生反射、折射和散射,形成多条传播路径。这些路径信号到达接收端的时间、相位各不相同&a…...
避坑指南:uniapp中使用previewImage和downloadFile API的常见问题与解决方案
Uniapp图片预览与下载功能深度避坑指南 在移动应用开发中,图片预览和下载是最基础却又最容易出问题的功能之一。很多开发者第一次使用uniapp的previewImage和downloadFileAPI时,都会遇到各种"坑"——图片加载不出来、下载失败、权限问题、安卓…...
c语言的优点介绍
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。接下来,小编为您介绍了c语言的优点介绍,感谢您的阅读! 1、简洁紧…...
