C++88个注意点子之31~40

来源:互联网 发布:地理信息平台软件 编辑:程序博客网 时间:2024/04/28 04:46

31.函数重载与重复声明的区别

1)若两函数形参表完全相同,且函数名也相同,但是返回类型不同,则这样的重载方式错误!!!在java中函数名和形参表组成一个函数签名,与返回值无关,重载只与函数签名有关。在这点上C++和java是一致的。

2)仅仅基于不同返回类型,不能实现重载,会报错。

3)默认实参不同不能重载

4)const形参要注意,若两函数,一个是普通引用或指针,一个是const引用或const指针形参,则可以重载。注意如果是一般的const变量做形参则不能引起重载,因为这样是完全没有意义的。为什么这么说呢?请看下面一个例子:

void f(const int a);

void f(int a);

当我将变量传给这两个函数时,不管函数内部怎么处理,我的变量值不会发生变化,因为是赋值传递。


32. 函数的作用域也要注意,函数内部局部的变量名或函数名会屏蔽相同名字的函数与变量。


33.函数重载的确定过程:

1)看有无最佳匹配

过程是:找候选函数 --> 确定可行函数 --> 寻找最佳参数匹配函数(确保无精度损失)

2)若无匹配函数,则发生错误

3)多个实参匹配函数,但无最佳选择时报错


34. 形参为enum枚举类型时,只有enum类型才能传入,int型不行,相反,如果形参是int型的,传入enum类型则可以,自动将enum类型提升为int类型。


35. 仅当形参是引用或指针时,形参是否为const才有影响。


36. 1)声明指向函数的指针,bool (*pf)(const string &)。*pf加括号是必须的,不然是声明函数。

2)在引用函数名但又没有调用该函数时,函数名将被自动解释为指向函数的指针。

3)直接引用函数名等效于在函数名上面应用取地址操作符。

如:cmpFunc pf1  = lengthCompare;

cmpFunc pf2 = &lengthCompare;

pf1 和pf2的值都是一样的。也许你会感到惊讶,其实这种规则我们早就见过了,在定义指向数组首地址的指针时,

int *pf1 = a; //a[10]

int *pf2 = &a;

pf1与pf2也是一样的。


37. 函数指针形参

可以将一个函数指针作为某个函数的形参。虽然用的比较少,但是了解一下还是有好处的。

void useBigger(const int a, bool (*p)(const string &));


38. 返回指向函数的指针

int (*ff(int a))(int *, int);

ff(int a)函数返回int (*p)(int*, int)指针的表达方式。

这样表达是非常难看的。

我们可以用typedef来简化一下。

typedef int (*pF)(int *, int);

pF ff(int);

如果你看了前面我们对typedef的论述,你一定不会有疑惑。


39. C++允许使用函数指针指向重载的函数。

但指针的类型必须与重载函数的一个版本精确匹配。


40. IO标准库类型和头文件。

我们最常用的就是标准输入输出流了,cin 和cout。这里我们来看一下各种流的类类型。如cin就是istream类型,cout就是ostream类型。

还有其他文件IO流类型,下面我们来看一下各种类型相关性(继承关系)。













这是官方文档上面的继承关系图,这样看一目了然。如果你有兴趣可以深入源代码去看一下。


0 0
原创粉丝点击