个人日志

物联网 & 极简主义

〈27,读书笔记——林锐·高质量C编程指南:卷8——C++函数的高级特性〉


本篇涉及C++的一些高级特性,C++中增加了重载,内联,const和virtual四种新机制。

而重载和内联可用于全局函数,也可用于类的成员函数。

const和 virtual只能用于类的成员函数

本篇则重点讨论重载和内联的优点及局限性。

——————————————————————————

1,重载的起源,实现和二义性

1.1 可以把语义功能相近的几个函数用一个名字表示,以提高易用性。

再则,可以用来实现多个同名构造方法

1.2 我们是靠不同的参数类型来区分不同的重载。

1.3 因重载机制,导致C和C++编译后函数内部标识符不同,故,要引用已编译过的C函数,则

extern “C”
{
#include “myhead.h”

void fun(int x, int y);
}

1.4 并不是函数同名即构成重载,如全局函数和类成员函数。因为其作用域不同

若类要调用全局函数,则要用‘::fun(全局)’的格式。

1.5 隐式类型转换导致重载产生二义性。


void fun(int x);
void fun(float x);

void main(void)
{
fun(0.5);//error,因为自动类型转换不知将其转换为int好,还是float好。
}

——————————————————————————

2,成员函数的重载,覆盖与隐藏

以上三种极易混淆。

2.1 覆盖,存在于不同类中,函数名字相同,参数相同,基类函数必须有virtual关键字。

2.2 隐藏,若派生类与基类名字相同,而参数不同,基类相关函数隐藏,注意不要与重载混淆

若派生类函数与基类名字相同,参数也相同,而基类函数没有virtual关键字,基类相关函数隐藏。注意与覆盖混淆。

2.3 消除隐藏

class Base
{
public:

void f(int x)
{}
};

class Derived
{
public:

void f(float x){}

void f(int x)
{
Base::f(int x);
}
};

——————————————————————————

3,参数的缺省值

3.1 参数的缺省值只能出现在声明中

3.2 若函数有多个参数,则参数只能挨个从后往前缺省

3.3 不合理的使用参数缺省将导致重载函数的二义性

——————————————————————————

4,运算符重载

4.1 如,复数相加

Complex operator +(const Complex &a, const complex &b)

4.2 运算符重载,其参数是在左右两侧

4.3 若运算符被重载在类内,则,一元没有参数,二元只有一个参数,因为对象自身填充了一个参数。

4.4 对于所有的一元运算符,建议重载为类内函数。

4.5 不建议非常热切的用操作符重载

4.6 一部分运算符不允许重载

——————————————————————————

5,函数内联

之所以支持函数内联,是它一定程度上提高了代码的执行效率。

一般而言,宏定义代码可以一定程度上提升效率,然而()容易处理不妥当,且无法操作类的私有数据成员。

故,这里引入了函数内联

5.1 对于任何内联函数,编译器在符合表里放入函数的声明 检查无误后,把代码体也放入。

这样,当调用一个内联函数时,编译器检查调用是否合法,若是,则自动替换。从而省去函数调用的开销。

所以,建议通通用函数内联取代宏,当然宏断言assert除外。

5.2 内联函数的编程风格

关键字 inline和函数定义体放一起。而非声明。

5.3 定义在类声明中的函数,会自动成为内联函数。

5.4 慎用内联

内联是以代码膨胀为代价,换来节省调用的开销。

一般代码过长,或有循环体的函数不适合内联。

——————————————————————————

此记录仅为笔记,若需原PDF,请留言

上一篇 下一篇
评论(2)
©个人日志 | Powered by LOFTER