函数重载与函数C++
function overloading vs function C++
在C++书籍中,当我们在C++中拥有模板时,为什么要教我们使用函数重载?
展示模板的有效(和正确)使用不是更好吗?与大多数C++书籍中教授函数重载的地方相反?
或者,是否有充分的理由使用其中一个而不是另一个?
当您想对可能不同的类型执行相同的操作时,模板提供了一个优势。一个简单的例子:
template <typename T>
T foo(const T& a, const T& b) { return a + b; }
当你想根据类型应用不同的操作时,你可以使用重载:
struct Foo{ void foo() const {} };
void foo(int i) { std::cout << "i = " << i << "n"; }
void foo(const Foo& f) { f.foo(); }
您可以使用模板和模板专业化来实现上述目的,但这种专业化应该代表一般情况下的一些例外。
模板不能接受不同数量的参数。过载可以。此外,模板表示您可以对任何数据类型进行操作,但表示这一点毫无意义,因为事实上,绝大多数模板都只是专门化的(在您的系统中)。此外,重载可以是virtual
,模板专业化不能。专业化在签名上也不能与基础有所不同。
template<typename T> void foo(T& t);
template<> void foo<std::string>(std::string* ptr); // Illegal
void foo(std::string* ptr); // Legal
与当前系统相比,这将严重限制您可能产生的过载类型。
当您想对许多不同的数据类型执行同一组操作时,通常会使用模板。
当您想对某些数据集执行不同的操作时,通常会使用函数重载。
在您希望对许多不同的数据类型执行同一组操作的情况下,模板的优势在于,编译器将在编译时为您处理将来可能创建的任何使用模板函数的新类型。如果要使用函数重载,那么每次创建要传递给特定函数的新类型时,都必须创建一个新的函数重载。
只是juancopanza答案的补充:
通过函数重载,您还可以改变参数的数量,这很方便。
一个简单的例子,如果您有一些带有以下声明的函数:
void foo(int i, int j);
但您经常使用第一个参数0来调用foo,您可以编写以下函数,这样可以节省一些类型。
void foo(int j) {
foo(0, j);
}
模板(通常)要求您使用相同的语法来对所有(支持的)类型执行操作。
函数重载的使用(或应该)类似,但允许您使用不同的语法来执行不同类型的操作。也就是说(尽管你不必)你可以用不同的方式来表达这些价值观。一个明显的例子是C库中所谓的atan
和atan2
。使用atan
,我们传递"上升"与"运行"的比率,并返回该比率所代表的角度。使用atan2
,我们分别传递上升和运行的值(计算的结果大致相同,但由于它提供了略多的输入数据,因此也可以产生更完整的结果)。
尽管这些函数在C中被实现为完全独立的函数,但如果它们从一开始就用C++编写,那么使用一个名称(例如atan
)重载一个和两个参数是完全合适的:
double atan(double); // equivalent to current atan
double atan(double, double); // equivalent to current atan2
模板(缺少专门化,这几乎只是覆盖模板本身提供的内容)在调用这样的语法时没有提供差异。
重载也更受约束——为要支持的每个特定类型提供一个重载(尽管如果使用指针或引用,它们也可以支持派生类型)。使用模板,单个模板可以(至少可能)应用于任何类型。
因此,overloading
和template
具有同等用途。
关于它们的一行difference
是:
overloading
在我们有各种功能时使用,执行SIMILAR
操作。
template
当我们有各种功能时使用,执行IDENTICAL
操作。
There is very big differnce between "SIMILAR" and "IDENTICAL".
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗