第14章 C++函数的高级特性
相比于C语言的函数,C++增加了重载(overload)、内联(inline)、const和virtual四种新机制。
14.1 函数重载的概念
1、函数重载便于记忆,提高了函数的易用性。
2、Google编程规范规定:
1)仅在输入参数类型不同, 功能相同时使用重载函数 (含构造函数)。
14.2 成员函数的重载(overload)、覆盖(override)和隐藏(hide)
14.3 参数的默认值
关于缺省(默认)参数,Google编程规范规定:5.3 我们不允许使用缺省函数参数。
理由是缺省参数有如下缺点:
大家通常都是通过查看别人的代码来推断如何使用 API的。用了缺省参数的代码更难维护, 从老代码复制粘贴而来的新代码可能只包含部分参数。当缺省参数不适用于新代码时可能会导致重大问题。
我的观点:全盘舍弃缺省参数的做饭有点不明智,但建议只在真正体现出缺省参数优点的地方才使用它。
14.4 运算符重载
1、在C++语言中,可以用关键字operator加上运算符来表示函数,叫做运算符重载(函数)。
2、运算符重载的基本规则:
1)一元运算符,赋值(包括复合赋值运算符)建议重载为类的成员函数。
2)其它的建议重载为全局函数。
14.5 内联函数
1、内联函数应该放在头文件中定义;关键字inline必须与函数定义体放在一起才能使函数真正内联。
2、《Effective C++》告诉我们,明智而谨慎的使用内联。
3、此外,一个好的编译器能够根据函数的定义体,自动取消不值得的内联,或者自动地内联一些没有inline请求的函数。
14.6 类型转换函数
1、向内转换:带有一个参数的构造函数。
2、向外转换(也称数据萃取):即自定义类型转换运算符。类型转换运算符定义以operator关键字开始,紧接着目标类型名和()。它们没有参数,实际上this就是它们的参数;也没有返回值类型,实际上函数名就是返回值类型。
3、类型转换运算符的好处在于:该类型的对象可以直接用在需要目标类型的地方,编译器能够自动调用转换运算符来完成转换。特别是在输出(>>)该对象时,可以不需要为该对象撰写流输出操作符了。
14.7 const 成员函数
1、const 对象只能访问const成员函数。而普通对象既可以访问普通成员函数,也可以访问const成员函数。
2、static成员函数只是全局函数的一个形式上的封装。
相比于C语言的函数,C++增加了重载(overload)、内联(inline)、const和virtual四种新机制。
14.1 函数重载的概念
1、函数重载便于记忆,提高了函数的易用性。
2、Google编程规范规定:
1)仅在输入参数类型不同, 功能相同时使用重载函数 (含构造函数)。
2)不要用函数重载模拟缺省函数参数。
因此,如果你想重载一个函数, 考虑让函数名包含参数信息, 例如, 使用 AppendString(), AppendInt() 而不是 Append().
14.2 成员函数的重载(overload)、覆盖(override)和隐藏(hide)
14.3 参数的默认值
关于缺省(默认)参数,Google编程规范规定:5.3 我们不允许使用缺省函数参数。
理由是缺省参数有如下缺点:
大家通常都是通过查看别人的代码来推断如何使用 API的。用了缺省参数的代码更难维护, 从老代码复制粘贴而来的新代码可能只包含部分参数。当缺省参数不适用于新代码时可能会导致重大问题。
我的观点:全盘舍弃缺省参数的做饭有点不明智,但建议只在真正体现出缺省参数优点的地方才使用它。
14.4 运算符重载
1、在C++语言中,可以用关键字operator加上运算符来表示函数,叫做运算符重载(函数)。
2、运算符重载的基本规则:
1)一元运算符,赋值(包括复合赋值运算符)建议重载为类的成员函数。
2)其它的建议重载为全局函数。
14.5 内联函数
1、内联函数应该放在头文件中定义;关键字inline必须与函数定义体放在一起才能使函数真正内联。
2、《Effective C++》告诉我们,明智而谨慎的使用内联。
3、此外,一个好的编译器能够根据函数的定义体,自动取消不值得的内联,或者自动地内联一些没有inline请求的函数。
14.6 类型转换函数
1、向内转换:带有一个参数的构造函数。
2、向外转换(也称数据萃取):即自定义类型转换运算符。类型转换运算符定义以operator关键字开始,紧接着目标类型名和()。它们没有参数,实际上this就是它们的参数;也没有返回值类型,实际上函数名就是返回值类型。
3、类型转换运算符的好处在于:该类型的对象可以直接用在需要目标类型的地方,编译器能够自动调用转换运算符来完成转换。特别是在输出(>>)该对象时,可以不需要为该对象撰写流输出操作符了。
14.7 const 成员函数
1、const 对象只能访问const成员函数。而普通对象既可以访问普通成员函数,也可以访问const成员函数。
2、static成员函数只是全局函数的一个形式上的封装。