【c++ primer, 5e】函数重载

时间:2021-01-01 09:24:34

【函数重载】

Java中的重载一般是指重载构造器,或是子类覆写父类的方法;C++中的重载稍微复杂一些。

定义重载函数

典型的数据库应用。

Record lookup(const Account&);
Record lookup(const Phone&);
Record lookup(const Name&);

判断两个形参类型是否相异

1、声明的时候省略形参和没省略是等价的。

2、起了类型别名也改变不了本质。

重载和const形参

1、一个拥有顶层const的形参无法和另一个没有顶层const的形参区分开来。例如:

Record lookup(Phone x1);
Record lookup(const Phone x2);

在上面的例子中,x1和x2都作为“对象的持有者”,并且可以持有的对象相同:两者都可以”持有“常量和变量,所以无法区分。

再如:

Record lookup(Phone* y1);
Record lookup(Phone* const y2);

不论是常量指针y2,还是普通指针y1,都是”既可以指向变量,也可以指向常量“。

2、但是,底层const形参和非const的同名形参是可以区分的,例如Name&和const Name&、Name*和const Name*。虽然const Name&既可以接收const对象也可以接收非const对象,但是当发生上述重载、调用的时候,编译器会优先选用非cosnt版本的函数。

const_cast和重载

1、C++函数返回引用

所以,返回引用的好处在于:不用创建副本变量。

2、重载函数可以调用另一个重载函数。

3、const_cast只能去掉本来就不是const变量的变量的const属性。

调用重载函数

可能会有三种结果:最佳匹配、无匹配、二义性调用。(后两者都会发生错误)

6.39

a 非法

b 非法

c 合法

【重载与作用域】

内层声明的与外层函数同名的变量、函数都会屏蔽外层函数,而不是重载!