在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++的“超能力”,你就能像魔法师一样,用代码创造出令人惊叹的魔法。不过,记得使用时要适度,否则可能会让代码变得难以控制。