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

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐