1.函数重载
函数重载规则与调用匹配
a.重载规则:
·函数名相同
·参数个数不同,参数类型不同,参数顺序不同,均可构成重载
·返回值类型不同则不可以构成重载
如下:
b.匹配规则
1)严格匹配,找到则调用
2)通过隐式转换寻求一个匹配,找到调用
具体的:C++允许 int到long和double,double到int和float的隐式转化,有隐式转换出现时可能会引起二义性(不能让计算机去选)。
重载底层实现:C++利用倾轧技术(name mangling),来给函数改名,区分参数不同的同名函数,
用v-c-i-f-l-d表示void char int float long double及其引用
void func(char a) ; //func_c(char a)
void func(char a,int b, double c ) //func_cid(char a,int b,double c)
倾轧发生在两个阶段 .cpp编译阶段,.h声明阶段
函数声明时与定义时要么都倾轧,要么都不倾轧,必须得一一对应,否则会报函数找不到的错误。
c++完全兼容C,则必须完全兼容C的类库,C 库只在连链接时加入,C文件类库文件中的函数名并没有倾轧,
而我们在包含.c文件所对应的.h文件时, .h要发生倾轧,就会发生错误。C++为了避免发生错误,重载了关
键词extern. 使用 entern"C" 或 extern"C"{} ,让C的头文件在编译时不倾轧,以此与C库中相对。
2.操作符重载
返回值类型 operator 运算符名称(形参列表)
{
重载实体;
}
operator 运算符名称 在一起构成了新的函数名
如: const Complex operator+(const Complex &c1,const Complex &c2); //operator+重载了运算符+
1)有四个运算符不能重载:
作用域操作符: ::
条件操作符: ?:
点操作符: .
指向成员操作的指针操作符: ->* .*
预处理符号: #
sizeof
2)不能定义新的运算符,只能对已有的进行重载
3)不能改变运算符运算对象的个数。 如“< ” “ >”是双目运算符,重载后仍为双目运算符
4)不会改变运算符优先级
5)不会改变运算符结合性,如 “=”是右结合(从右至左),重载后仍为从右至左
6)重载运算符的函数不能有默认参数
7)重载运算符的运算中至少有一个操作数是自定义类,重载的运算符必须和用户自定义类型的对象一起使用,其参数至少应有一个是类对象
8)“=” “&”不必重载
9)对运算符重载,不应该失去其原有功能
c++运算符重载的方法:(成员函数,友元函数,普通函数)
1.使重载运算符成为该类的成员函数。这允许运算符函数访问类的私有成员。它也 允许函数使用隐式的this指针形参来访问调用对象。
2.使重载的成员函数成为独立分开的函数。当以这种方式重载时,运算符函数必须 声明为类的友元才能访问类的私有成员。 1 //作为成员函数重载 2 class Person{ 3 Private:
4 string name; 5 int age; 6 public: 7 Person(const char* name, int age):name(name),age(age){} 8 bool operator<(const Person& b); 9 10 }; 11 bool Person::operator<(const Person& b) 12 { 13 //作为成员函数时,*this即为左操作数a 14 ... //单目运算符作为类成员函数重载时没有型参(除了后置自增(自减)有一个整型参数),
//双目运算符作为类成员函数重载时只有一个形参,作为运算符的右操作数,其左操作数就是本对象自己,也就是this。 15 }
//作为友元函数重载
//友元函数(友元函数则是指某些虽然不是类成员却能够访问类的所有成员的函数)进行重载,
//那么它就不存在this指针了,所以需要定义两个参数来运算(对于双目运算符),而友元函数的实现可以在外面定义,但必须在类内部声明。
1 #include <iostream>
2 #include <cstdlib>
3
4 using namespace std;
5
6 class A {
7 private:
8 int a;
9 int b;
10 public:
11 A(int x = 0, int y = 0):a(x), b(y){}
12 friend A operator+ (A &C, A &D);
13 };
14
15 A operator+ (A &C, A &D) {
16 A G;
17 G.a = D.a + C.b;
18
19 return G;
20 }
21
22 int main()
23 {
24 A G(5, 6);
25 A J(7, 8);
26 A K;
27 K = G + J;
28
29 return 0;
30 }
原文链接: https://www.cnblogs.com/liu6666/p/12427847.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/333759
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!