函数原型
语法
返回值类型 函数名(参数表);
C和C++的区别
C在声明函数原型时,可以省略返回值类型和参数表,但在C++中对返回值类型和参数表为强制要求(我认为是因为C++引入了重载机制)
内联函数
- 函数说明前冠以inline关键字的函数,又称内置函数
- 作用:每当程序中出现对该函数的调用时,C++编译器使用函数体中的代码插入到调用该函数的语句处,同时用实参取代形参,以便在程序运行时不再进行函数调用,加快运行
#include <iostream>
using namespace std;
inline int box(int i,int j, int k);
int main(){
int a,b,c,v;
cin>>a>>b>>c;
v=boc(a,b,c);//等价于在这里执行 v=a*b*c;
cout<<"a*b*c="<<v<<endl;
return 0;
}
inline int box(int i,int j,int k){
return i*j*k;
}
带有默认参数的函数
- 在声明函数时所有指定了默认值的参数都必须出现在不指定默认值的参数右边
- 在函数调用是,若某个参数省略,则其后的参数皆应省略而采用默认值
- 如果函数的定义在函数调用之前,则应在函数定义中指定默认值。相反,如果函数的定义在函数调用之后,则在函数调用之前必须进行函数声明,此时必须在函数声明中给出默认值,而在函数定义时就不要给出默认值
函数重载
- 调用重载函数时,函数返回值类型不在参数匹配之列,因此,若两个函数的参数个数和类型都相同,只有返回值类型不同,则不允许重载
函数的重载和带默认参数的函数一起使用时,有可能引起二义性
void DrawCircle(int r=0,int x,int y); void DrawCircle(int r); //调用时 DrawCircle(20)//无法确定是那个函数
- 在函数调用时,如果给出的实参与形参类型不一致,C++编译器会自动地进行类型转换工作
作用域运算符“::”
- 如果希望在局部变量的作用域中使用同名的全局变量,可以在该变量前加上"::"
无名联合
- 无名联合时C++中的一种特殊联合,在union关键字之后没有联合名,不能访问无名联合变量,只能访问其成员
union
{
int i;
double d;
} x;
x//错误
x.i;
x.d;
运算符new和delete
指针变量名=new 类型
指针变量名=new 类型(初值)
delete 指针变量名
为数组动态分配空间
指针变量名=new 类型[整数] [整数]...
delete []指针变量名
引用
声明引用的格式
类型 & 引用名=已定义的变量名
类型 & 等价于 类型 * const 指向对象不能改变
说明:
- 除了用作函数的参数或返回类型外,在声明引用时,必须对它进行初始化,不能在声明完成后再赋值
- 为引用提供的初始值,可以是一个变量,也可以是另一个引用
- 引用在初始化后不能再赋值,即不能改变为另一个变量的引用
- 无void类型的引用
不能建立引用的数组
int a[4]='abcd'; int &ra[4]=a;//错误,不能建立引用数组
不能建立引用的引用,不能建立指向引用的指针
int n=3; int &&r=n//错误 int &*p=n//错误
可以将引用的地址赋值给指针
int num=50; int &ref=num; int *p=&ref;
引用作为函数参数
返回值类型 函数名(类型& 变量名,类型& 变量名,....)
在函数中对引用的操作,直接作用于实参,简化了C中传指针作为参数的写法,经典案例swap函数
使用引用返回函数值
采用这种方法可以将函数调用放在幅值运算符的左边
#include <iostream> using namespace std; int a[]={1,3,5,7,9}; int &index(int); int main(){ index(2)=25; cout<<index(2)<<endl; return 0; } int &index(int i){ return a[i]; }