c++中的内联函数inline友元函数friend和仿函数类

在C++的魔法世界里,有三种“超能力”:内联函数inline、友元函数friend和仿函数类。它们各具特色,但都拥有让代码更加优雅和强大的魔力。最近有同学开始使用友元函数来实现重载,既然这样,今天,我们就将他们三个的优缺点和使用时的注意点一起来复习一下。

文章目录

    • 一、内联函数inline:代码的“瘦身”专家
      • 使用场景
      • 优缺点
      • 示例代码
    • 二、友元函数friend:类的“密友”
      • 使用场景
      • 优缺点
      • 示例代码
    • 三、仿函数类:函数的“变身”
      • 使用场景
      • 优缺点
      • 示例代码
    • 注意事项

一、内联函数inline:代码的“瘦身”专家

内联函数就像是减肥达人,它能让你的代码变得更苗条。当你有一个小而频繁被调用的函数时,内联函数可以减少函数调用的开销,就像减肥一样,让你的程序跑得更快。

使用场景

想象一下,你有一个计算两个数和的函数,它被调用的次非常多,多得像眨眼睛一样频繁。这时,内联函数就是你的救星。

优缺点

优点:

  • 减少调用开销,让你的程序跑得像兔子一样快。
  • 代码更简洁,阅读起来就像读一本轻松的小说。

缺点:

  • 如果你过度使用,可能会让代码变得像膨胀的气球,难以控制。
  • 编译时间可能会增加,因为编译器需要在每个调用点展开代码。

示例代码

#include <iostream>// 内联函数,计算两个数的和
inline int add(int a, int b) {return a + b;
}int main() {int sum = add(3, 4); // 代码瘦身,直接展开std::cout << "Sum is: " << sum << std::endl;return 0;
}

二、友元函数friend:类的“密友”

友元函数就像是类的密友,它能访问类的私有和保护成员,就像密友能分享你的秘密一样。

使用场景

当你需要在类的外部访问类的私有成员时,友元函数就是你的最佳选择。

优缺点

优点:

  • 提供了一种灵活的访问控制方式,让你的类设计更加灵活。

缺点:

  • 破坏了封装性,就像把秘密告诉了太多人,可能会让类的设计变得复杂。

示例代码

#include <iostream>class Complex {
private:int real;int imag;public:Complex(int r = 0, int i = 0) : real(r), imag(i) {}// 友元函数,输出复数friend std::ostream& operator<<(std::ostream& os, const Complex& c);
};// 实现友元函数
std::ostream& operator<<(std::ostream& os, const Complex& c) {os << c.real << " + " << c.imag << "i";return os;
}int main() {Complex c(3, 4);std::cout << "Complex number: " << c << std::endl;return 0;
}

三、仿函数类:函数的“变身”

一般的时候我们可能简称为仿函数,但是这个不是函数而是类,只不过它能够像函数一样调用(但必必须想对象一样声明后才可以使用)仿函数类就像是变身英雄,它能像函数一样被调用,还能拥有自己的状态。

使用场景

当你需要将函数作为参数传递给其他函数时,仿函数类就是你的得力助手。

优缺点

优点:

  • 提供了一种灵活的方式来封装函数行为,让你的代码更加模块化。

缺点:

  • 如果仿函数类设计得不够简洁,可能会让代码变得像迷宫一样复杂。

示例代码

#include <iostream>
#include <vector>
#include <algorithm>// 仿函数类,判断一个数是否为偶数
class IsEven {
public:bool operator()(int n) const {return n % 2 == 0;}
};int main() {std::vector<int> vec = {1, 2, 3, 4, 5, 6};// 使用仿函数类vec.erase(std::remove_if(vec.begin(), vec.end(), IsEven()), vec.end());for (int n : vec) {std::cout << n << " ";}std::cout << std::endl;return 0;
}

注意事项

  • 内联函数inline: 就像减肥,适度才是关键。不要过度使用,否则可能会让代码膨胀。
  • 友元函数friend: 就像交朋友,要谨慎选择。过度使用可能会让类的设计变得脆弱。
  • 仿函数类: 设计时要保持简洁,就像写小说,清晰明了才能吸引读者。

通过掌握这些C++的“超能力”,你就能像魔法师一样,用代码创造出令人惊叹的魔法。不过,记得使用时要适度,否则可能会让代码变得难以控制。

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

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

相关文章

董宇辉离职,我一点都不意外!只不过感觉来的太快

下面这张图&#xff0c;是我在半年多前写的一段随笔&#xff0c;没想到来的这么快&#xff01; 碰巧的是今天中午&#xff0c;在开发者群里有两位老铁自曝&#xff0c;本以为能公司干到老&#xff0c;但公司却不给机会&#xff0c;已经不在是公司员工了。 最近&#xff0c;晓衡…

粗解React 和 Vue 的异同

相同点&#xff1a; 1、都使用虚拟 DOM【Virtural DOM】 Vue与React都使用了 Virtual DOM Diff算法&#xff0c; 不管是Vue的Template模板options api 写法&#xff0c; 还是React的Class或者Function写法,最后都是生成render函数&#xff0c;而render函数执行返回VNode(虚拟…

iOS collectionView 滑动出现空白

iOS collectionView 滑动出现空白 一个很常见的 banner 轮播&#xff0c;滑动的时候&#xff0c;有时候会出现空白&#xff0c;检查了下&#xff0c;发现代码没什么问题&#xff0c;上网查了也没啥结果&#xff0c;最后的解决方法是自定义layout解决 interface TMLoopViewLayo…

创新概念:柯尔莫哥洛夫-阿诺德网络

文章目录 一、说明二、基础概念三、kolmogorov-Arnold 网络性质3.1 KAN 的潜在优势3.2 挑战和注意事项 四、基本 KAN 超参数五、COLAB 代码六、注意点 一、说明 kolmogorov-Arnold 网络 (KAN) 是深度学习领域的一项“创新”&#xff0c;它提供了一种受现有 Kolmogorov-Arnold …

1180:分数线划定

思路&#xff1a; 简化&#xff1a; 我们可以用 define 把数对的 first 和 second 简化成 X 和 Y。随后用 typedef 把 pair<int,int> 简化成 PIR。 保存&#xff1a; 输入 num 和 score 后&#xff0c;我们可以用可变数组的 push_back() 来保存进去。 排序&#xff…

python基础---1.变量、运算符和表达式、基本数据结构

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;python &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&…

算法刷题笔记 Dijkstra求最短路(C++实现)

文章目录 题目描述基本思路实现代码 题目描述 给定一个n个点m条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;所有边权均为正值。请你求出1号点到n号点的最短距离&#xff0c;如果无法从1号点走到n号点&#xff0c;则输出−1。 输入格式 第一行包含整数n和m。接…

使用Docker搭建MySql的主从同步+ShardingSphere搭建Mysql的读写分离

参考课程 尚硅谷ShardingSphere5实战教程&#xff08;快速入门掌握核心&#xff09;_哔哩哔哩_bilibili 主服务器 创建容器 docker run -d \ -p 3306:3306 \ -v /kira/mysql/master/conf:/etc/mysql/conf.d \ -v /kira/mysql/master/data:/var/lib/mysql \ -e MYSQL_ROOT…

QtQuick-QML类型系统-对象特性(id和属性)

每一个QML对象类型都包含一组定义好的特性。 每个对象类型的实例在创建时都会包含一组特性&#xff0c;这些特性是在该对象类型中定义的。一个QML文档中的对象声明定义了一个新的类型&#xff0c;其中可以包含如下特性&#xff1a; id特性属性&#xff08;property&#xff0…

(day26)leecode热题——找到字符串中所有字母异位词

描述 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 示例 1: 输入: s "cbaebabacd", p …

Kubernets——常用命令

Kubernets命令总结 命令说明 命令格式命令说明kubectl run 资源名称 -参数 --image镜像名称:标签创建资源对象&#xff0c;常用参数-i交互&#xff0c;-t终端kubectl get 查询资源 可选参数 -o wide 显示主机信息常用查询的资源 node|deployment|podkubectl exec -it 容器id …

【Git-驯化】一文搞懂git中代码冲突的解决方案大全

【Git-驯化】一文搞懂git中代码冲突的解决方案大全 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#xff1a…

[C++实战]日期类的实现

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到C探索系列 作为一个程序员你不能不掌握的知识 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成本搭建个人网站…

ELK安装(Elasticsearch+Logstash+Kibana+Filebeat)

一、简介 1.1、软件简介 ELK其实是Elasticsearch&#xff0c;Logstash 和 Kibana三个产品的首字母缩写&#xff0c;这三款都是开源产品。 1.1.1、Elasticsearch简介 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析…

springboot微信老人健康与饮食管理系统-计算机毕业设计源码82939

基于微信老人健康与饮食管理系统的小程序 摘 要 基于Spring Boot的微信老人健康与饮食管理系统的小程序致力于为老年人提供便捷的健康管理和饮食指导服务。该小程序整合了健康资讯浏览、食谱推荐、健康评估等功能模块&#xff0c;通过系统的设计与实现&#xff0c;旨在帮助老年…

古丝绸之路传闻二:十年败壳精灵显,一介穷神富贵来

古丝绸之路传闻二&#xff1a;十年败壳精灵显&#xff0c;一介穷神富贵来 &#xff08;接上节&#xff1a;古丝绸之路传闻&#xff1a;分内功名匣里财&#xff0c;不关聪慧不关呆&#xff09; 先别说闲话。且说众人带着经纪主人到船上发货&#xff0c;文若虚把之前的事情说了一…

AccessLog| 一款开源的日志分析系统

前言 ClkLog作为分析系列产品中的前端数据分析系统&#xff0c;通过采集前端应用数据进行用户行为分析。其社区版从23年9月发布至今已有近一年&#xff0c;商业版也上线快半年&#xff0c;感谢大家一直以来的关注和支持&#xff0c;ClkLog会继续做好产品升级与服务&#xff0c;…

Linux冯诺依曼体系、操作系统、进程概念、进程状态、进程切换

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;Linux 目录 一、冯诺依曼体系结构 二、操作系统 1、概念 2、为什么要有操作系统&#xff1f; 3、理解操作系统 1.管理的本质 2.管理的概念 3.操作系统结构图 4.为什么要有操作系统&#xff1f; 三…

ASP.NET Core Web深度探讨

ASP.NET Core作为现代Web开发的基石&#xff0c;以其跨平台、高性能和模块化设计的特点&#xff0c;成为许多开发者的首选框架。本文将深入探讨ASP.NET Core在Web开发中的应用&#xff0c;包括MVC、Razor Pages、Blazor等框架的使用&#xff0c;以及路由、中间件、身份认证、会…

golang websocket 手写研究机制

// 处理ws请求 func WsHandler(w http.ResponseWriter, r *http.Request, id string) {var conn *websocket.Connvar err errorpingTicker : time.NewTicker(time.Second * 10)conn, err wsupgrader.Upgrade(w, r, nil)if err ! nil {log.Printf("Failed to set websocke…