ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

C++:函数重载

C++:函数重载 定义同一个作用域中可以定义读个同名函数只要他们的参数列表不同编译器就能根据调用时传入参数判断应该调用哪一个。例如下面这两个函数都是叫Add但是他们传入的参数不同。int Add(int a, int b) { return a b; } double Add(double a, double b) { return a b; }Add(1, 2); 调用 int Add(int, int)Add(1.5, 2.5); 调用 double Add(double, double)这就是函数重载。还有最直观的例子参数数量不同。例如void Print(int a) { std::cout a std::endl; } void Print(int a, int b) { std::cout a b std::endl; } void Print(int a, int b, int c) { std::cout a b c std::endl; }但是返回值不同不能构成函数重载。operator在 C 中operator是一个关键字。它主要用于定义或重载运算符的行为。比如我们平时写a b这里的就是一个运算符。C允许我们自己规定如果a和b是我自己定义的类对象那么a b应该怎么计算这就是运算符重载Operator Overloading。常见的运算符运算符作用加法-减法*乘法/解引用/除法判断相等!判断不等小于大于[]下标访问()函数调用自增--自减左移/流输出右移/流输入为什么需要operator假设我们自己定义一个二维点class Point { public: double x; double y; };然后Point p1; Point p2;我们想实现Point p3 p1 p2;但是问题来了C知道 int int 怎么计算。也知道double double 怎么计算。但是它不知道Point Point应该怎么算。所以我们可以告诉 Cp1 p2应该x相加y相加class Point { public: double x; double y; Point operator(const Point other) { Point result; result.x x other.x; result.y y other.y; return result; } };这里operator就是重载运算符。怎么使用有了上面的定义Point p1; Point p2; p1.x 1; p1.y 2; p2.x 3; p2.y 4;然后Point p3 p1 p2;结果p3.x 4 p3.y 6p1 p2到底发生了什么p1 p2实际上可以理解为p1.operator(p2)所以p1 p2和p1.operator(p2)本质上是在调用同一个东西。所以operator可以拆开理解Point operator(const Point other)可以理解成Point ↑ 返回值 operator ↑ 我要重载 (const Point other) ↑ 参数C允许对象也使用()例如class Test { public: void operator()() { cout Hello; } };现在Test t;可以t();这看起来像函数。但实际上t();调用的是t.operator()();也就是说把一个对象设计成“可以像函数一样调用”。这种对象通常叫函数对象Function Object / Functor。operator()可以带参数例如class Calculator { public: int operator()(int a, int b) { return a b; } };然后Calculator calc;可以int result calc(10, 20);实际上int result calc.operator()(10, 20);operator()可以重载例如class Test { public: void operator()(int x) { cout int endl; } void operator()(double x) { cout double endl; } void operator()(int x, int y) { cout two int endl; } };那么Test t;可以t(10);调用operator()(int)t(3.14);调用operator()(double)t(10, 20);调用operator()(int, int)所以operator() 本身也可以进行函数重载。operator并不等于“函数”operator是一个关键字。例如operator 表示重载 operator- 表示重载 - operator[] 表示重载[] operator() 表示重载()所以operator operator - operator * operator / operator operator [] operator ()都是使用operator关键字来定义运算符重载函数。
返回列表