返回值
系統自動生成返回值的副本,該副本可以在程序中的返回點獲得
函數原型聲明
除非函數的定義在相同源文件的前面,否則必須使用函數原型聲明(通常在#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
注:
引用的基本屬性:聲明並初始化引用之後,不能將其重新分配給另一個變量。但是這裏美執行一次函數都初始化一個新的引用