返回值

系统自动生成返回值的副本,该副本可以在程序中的返回点获得

函数原型声明

除非函数的定义在相同源文件的前面,否则必须使用函数原型声明(通常在#include和using之后):

#include <iostream>

using namespace std;

double power(double x,int y);  //函数原型声明,形参可以和函数实现不同甚至只写double,int

int main()

{

   x=power(y,z);

}

double power(double x1,int y1)   //函数实现

{}

函数传递实参的两种形式:

一、形参是普通变量(不是引用)

1.按值传递机制

实参根本没有传递给函数,而是和实参具有相同值的副本传递给函数,所以函数的执行并不会影响实参:

int x=1;

int change(x);

不管change函数如何,int x都不会被改变

2.给函数传递指针实参

传递的是和实参指针存储相同地址的指针副本,因为指向的地址相同,所以可以改变被指向的地址

例:

void change(int*);

int main()

{

    int x=10;

int* px=&x;

change(px);

cout<<*px<<endl;

}

void change(int* px)

{

*px+=10;

}

结果:

10

3.给函数传递数组

实质上是给函数传递指针,传递指针副本(编译器将数组名转换为指针)而不是数组副本(复制数组需要很大开销)

void change(int [],int);

int main()

{

int x[]={1,2,3,4,5};

int count=sizeof x/sizeof x[0];

    change(x,count);

for(int i=0;i<count;i++)

{

cout<<x[i]<<" ";

}

}

//void change(int arrayx[],int count)

void change(int* arrayx,int count)      //和上等价

{

for(int i=0;i<count;i++)

{

arrayx[i]+=1;

}

}

结果:2 3 4 5 6

4.多维数组

本地C++的多维数组的本质为数组的数组,所以传递的同样是指针副本(如二维数组传递的是指向第一行地址的指针副本)

例:

void change(int [][4],int);

int main()

{

int x[][4]={{1,2,3,4},{5,6,7,8}};

int count=sizeof x/sizeof x[0];

change(x,count);

for(int i=0;i<count;i++)

{

for(int j=0;j<4;j++)

{

cout<<x[i][j]<<" ";

}

cout<<endl;

}

}

void change(int arrayx[][4],int count)

//也可以写成void change(int (*arrayx)[4],int count)然后下面用++*(*(arrayx+i)+j);的形式,函数原型声明也要改成相应形式

{

for(int i=0;i<count;i++)

{

for(int j=0;j<4;j++)

{

++arrayx[i][j];

}

}

}

结果:

2 3 4 5

6 7 8 9

二、给函数传递引用实参

形参为实参的别名,消除的对实参的复制,允许函数直接访问调用函数中的实参

使用类类型的对象时很有用,因为复制很大的类的类对象要耗费很多时间

例:

void change(int&);

int main()

{

int x=10;

change(x);

int y=20;

change(y);

cout<<x<<" "<<y<<endl;

}

void change(int &x)

{

cout<<"receive"<<x<<endl;  //输出的是值而不是地址

x++;

}

结果:

receive10

receive20

11 21

注:

引用的基本属性:声明并初始化引用之后,不能将其重新分配给另一个变量。但是这里美执行一次函数都初始化一个新的引用