void型指针可以接受任何类型的指针的赋值,但对已获值的void型指针,对它在进行处理,如输出或传递指针值时,则必须进行强制类型转换,否则会出错。
#include <iostream.h> main() { void *pc; int i=456; char c='a'; pc=&i; cout<<*(int *)pc<<endl; pc=&c; cout<<*(char *)pc<<endl; return 0; } 8. 内联函数调用函数时系统要付出一定的开销,用于信息入栈出栈和参数传递等。特别是对于那些函数体较小但调用又较频繁的函数,计算机的开销相对就比较可观。
在C语言中,用宏替换,可解决这个问题。例如,有如下的函数:
add(int x,int y) { return x+y; }用宏替换时,上面的函数功能可写为:
#define add(x,y) x+yC++引进了内联函数(inline function)的概念。
宏替换实质上是文字替换。内联函数与一般函数不同的是,在进行程序的编译时,编译器将内联函数的目标代码作拷贝并将其插入到调用内联函数的地方。
例1.7 内联函数的使用 #include "iostream.h" inline double circle(double r) {return 3.1416*r*r;} int main() { for(int i=1;i<=3;i++) cout<<"r="<<i<<" area="<<circle(i)<<endl; return 0; } 说明:(1). 内联函数在第一次被调用前必须进行声明或定义,否则编译器将无法知道应该插入什么代码。
(2). C++的内联函数具有与C中的宏定义#define相同的作用和类似机理,但消除了#define的不安全性。
(3). 内联函数体内一般不能有循环语句和开关语句。
(4). 后面类结构中所有在类说明体内定义的函数都是内联函数。
(5). 通常较短的函数才定义为内联函数。
9. 带有缺省参数值的函数在C++中,函数的参数可以有缺省值。
当调用有缺省参数的函数时,如果相应的参数没有给出实参,则自动用相应的缺省参数值作为其实参。
函数的缺省参数,是在函数原型中给定的。
例如:
int init(int x=5, int y=10); init(100,80); //允许 init(25); //允许 init(); //允许 说明:
(1)在函数原型中,所有取缺省值的参数必须出现在不取缺省值的参数的右边。
int fun(int I,int j=5,int k); 错误
int fun(int I,int k,int j=5); 正确
(2)在函数调用时,若某个参数省略,则其后的参数皆应省略而采用缺省值。
init (,20) 错误
例.编写一个带有默认参数的函数,使得在默认情况下显示两个整数的较大者,否则显示两个整数的较小者。 int main() { void showValue(int x, int y, bool Max = true); // 声明函数 int a = 5, b = 10; showValue(a,b); showValue(a,b,false); return 0; } void showValue(int x, int y, bool Max = true) // 定义函数 { if(Max) cout << “the bigger value is: " << (x>y)?x:y << endl; else cout << "the smaller value is: " << (x<y)?x:y << endl; } 10. 函数重载 (1) 什么是函数重载函数重载是指一个函数可以和同一作用域中的其他函数具有相同的名字,但这些同名函数的参数类型、参数个数不同。如:
#include <iostream.h> void whatitis(int i) { cout<<"this is integer"<<i<<endl;} void whatitis(char c[]) { cout<<“this is string”<<c<<endl; } main() { int i=1; char c[]="abcdef"; whatitis(i); whatitis(c); }在本例中定义了两个名称都叫whatitis的函数,但它们的形参类型不同。因此,这两个函数就是重载函数。
(2) 为什么要使用函数重载在原有C语言中,每个函数必须有其唯一的名称,这样的缺点是所有具有相同功能、而只是函数参数不一样的函数,就必须用一个不同的名称.