C++高质量编程指南笔记(五)

来源:互联网 发布:云计算需求调研报告 编辑:程序博客网 时间:2024/06/05 04:57

函数重载

1、C++程序不能直接调用C函数。C++提供了一个C连接制定符号extern “C” 来解决这个问题。
例如:

extern "C"{    void foo(int x, int y);}extern "C"{    #include "myheader.h"}

告诉编译器找名字_foo而不是_foo_int_int。

2、并不是两个函数的名字相同就能重载。全局函数和类的成员函数不算重载,因为函数的作用域不同。
例如:

void Print(...);        //全局函数class A{    void Print(...);    //成员函数};

不论两个函数的参数是否不同,如果类的某个成员函数要调用全局函数Print,为了与成员函数Print区别,全局函数调用时应加上”::”标志。如

::Print(...);   //表示Print是全局函数

3、隐式类型转换导致重载产生二义性

void Print(int x){    cout << "int: " << x << endl;}void Print(float y){    cout << "Float: " << y << endl;}void main(){    Print(1.5);    //出错,自动类型转换,因为是double编译器不知道是进入int还是float的函数}

函数的重载、覆盖与隐藏

1、重载与覆盖
成员函数被重载的特征:
(1) 相同的范围(同一个类中)
(2) 相同的名字
(3) 参数不同
(4) virtual关键字可有可无

覆盖是派生类函数覆盖基类函数,特征是:
(1) 不同的范围(分别位于派生类和基类)
(2) 函数名字相同
(3) 参数相同
(4) 基类函数必须有virtual 关键字

隐藏的特征:
(1) 如果派生类的函数与基类的函数名相同,但是参数不同,此时,不论有无virtual关键字,基类的函数都会被隐藏。
(2) 如果派生类的函数与基类的函数相同,参数也相同,但是没有virtual关键字,基类的函数都会被隐藏。

参数的缺省值

1、参数的缺省值应该放在声明中

void Func(int x = 0, int y = 0);    //函数声明void Func(int x = 0, int y = 0)     //错误,在函数定义里{}

2、不合理的使用可能会导致二义性

void Print(int x);void Print(int x, float y = 0);Print(1);   //产生二义性

内联函数

1、用内联函数取代C的宏
使用宏出错,且宏无法操作类的私有成员。
例如

#define MAX(a, b) (a) > (b) ? (a) : (b)result = MAX(1, 2) + 2;//预处理器解释为result = (1) > (2) ? (1) : (2) + 2; +的优先级高,出错。

2、内联函数的风格

void Func(int x, int y);inline void Func(int x, int y)  //inline放在函数定义中,放在声明中不起作用,在类声明中定义的函数会自动转化为内联函数{    ...}
(1)如果函数体的代码比较长,使用内联会导致内存消耗比较高。(2)如果出现循环,那么执行函数体内的代码的时间比函数调用的开销大。(3)类的构造和析构函数可能会隐藏一些行为,比如“偷偷的”执行了基类或成员对象的构造函数和析构函数。所以不要随便的将构造函数和析构函数的定义放在声明中。
0 0
原创粉丝点击