第五章 程序結構

返回值

系統自動生成返回值的副本,該副本可以在程序中的返回點獲得

函數原型聲明

除非函數的定義在相同源文件的前面,否則必須使用函數原型聲明(通常在#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

注:

引用的基本屬性:聲明並初始化引用之後,不能將其重新分配給另一個變量。但是這裏美執行一次函數都初始化一個新的引用


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章