c++ primer

int fact(int val)
{
    int ret=1whileval>1)
        ret*=val--;
    return ret;
}

調用函數
int main()
{
int j=fact(5);
cout<<”5! is”<

    int val=5int ret=1whileval>1)
        ret*=val--;
    int j=ret;

形參和實參
實參是形參的初始第二個第一個形參,第二個實參初始化值。第一個實參初始化形參,以此內推。儘管實參和形參存在對應關係,但是並沒有規定實參的求值順序。
實參的類型必須與對應的形參類型匹配,這一點與之前的規則一致的,初始化過程中初始值必須與初始化的類型匹配。
fact函數只有一個int類型的形參,所以每次調用它的時候,都必須提供一個能轉換成int的實參:

    fact(“hello”);
    fact();
    fact(42,10,0);
    fact(3.14);
```類型數量不同都不行,
double可以轉成int
等價於fact(3);

函數的形參列表
函數的形參列表可以爲空,但是不能省略,也可以使用關鍵字void表示函數沒有形參:
void f1(){}
void f2(void){}

列表中形參通常用逗號隔開,其中每個形都含有聲明符的聲明。即使兩個形參類型一樣,也必須把兩個類型寫出來:





<div class="se-preview-section-delimiter"></div>

int f3(int v1){}
int f4(int v1,int v2){};錯誤

任意兩個形參都不能同名,而且函數最外層作用域的局部變量也不能與函數形參一樣的名字

“`

函數的返回類型
大多是類型都能用作函數的返回類型。一種特殊的返回類型是void,它表示函數不返回任何值。函數的返回類型不能是數組類型或函數類型。可以是指向數組或函數的指針。

6.11局部對象
名字有作用域;
對象有生命週期

名字的作用域是程序文本的一部分,名字在其中可見。對象的生命週期是程序執行過程中該對象存在的時間。

int f3(int v1){}
int f4(int v1,int v2){};錯誤

任意兩個形參都不能同名,而且函數最外層作用域的局部變量也不能與函數形參一樣的名字

函數的返回類型
大多是類型都能用作函數的返回類型。一種特殊的返回類型是void,它表示函數不返回任何值。函數的返回類型不能是數組類型或函數類型。可以是指向數組或函數的指針。

6.11局部對象
名字有作用域;
對象有生命週期

名字的作用域是程序文本的一部分,名字在其中可見。對象的生命週期是程序執行過程中該對象存在的時間。

函數體是一個語句塊,塊構成一個新的作用域,我們可以在其中定義變量。形參和函數體內部定義的變量統稱局部變量,它們對函數體而言是局部的,僅僅在函數的作用域內可見,同時局部變量還會隱藏。
在所有函數體之外定義的對象存在於程序的整個執行過程中,此類對象在程序中被創建,值得程序結束纔會銷燬。局部變量的生命週期依賴於定義的方式。

自動對象
對於普通局部變量對應的變量來,當函數的控制路徑經過變量定義語句時被創建,對於定義所在的塊末尾時銷燬它,我們把只存在執行期間的對象被稱爲自動對象。
形參是一種自動對象。
我們用傳遞給函數的實參初始化對應的自動對象。對於局部變量的自動對象分爲兩種情況:變量本身含有初始值,就用這個初始值進行初始化,否則,如果變量定義不含有初始值,則執行默認初始化。

局部靜態對象
某些時候,局部變量的生命週期貫穿函數和調用之後的時間,可以講局部變量定義成static類型從而獲得這樣的對象。局部靜態對象在程序執行路徑第一次經過對象定義語句初始化,並且直到程序終止才能被銷燬。在次期間即使對象所在的函數結束執行也不會對它的有影響。

size_t count_calls()
{
static size_t ctr=0;
return ++cnt;
}
int main()
{
for(size_t i=0;i!=10;++i)
    cout<<count_calls()<<endl;
return 0;
}

每次執行count_calls函數時,變量ctr的值都已經存在並且等於上一次退出是ctr的值,第二次調用ctr的值是1,第三次調用ctr的值是2

6.1.2
函數的名字在使用前必須聲明類似於變量函數可以定義一次但可以聲明多次,如果一個函數只被用到一次,那它只可以聲明沒有定義。
函數的聲明無須函數體,一個分號就可以啊
因爲函數的聲明不包含函數體,所以無須形參的名字。
void print(vector::const_iterator beg,vector::const_iterator end);

6.2參數傳遞
每次調用函數時都會重新創建它的形參,傳人形參並用它對形參初始化
形參的類型決定了形參和實參的交互方式,如果形參是引用類型,它將綁定到對應的實參上,否則將拷貝的值傳給形參
當形參是引用類型時,是對應形參的引用傳遞,引用形參也是綁定對象的別名,引用形參是對應實參的別名。
實參的值拷貝給形參時候,實參形參是兩個相互獨立的對象是值傳遞或者函數傳值調用
6.2.1
傳值參數
當初始化一個非引用類型變量時,初始值被拷貝給變量,變量的改動不會影響初始值。

int n=0;
int i=n;
i=42;

在函數內對變量val執行遞減操作
ret*=val–;
儘管fact函數改變了val的值,但這個改動不會影響傳入fact的實參,調用fact(i)不會改變i的值。
指針形參
指針的行爲和其他非引用類型一樣。當執行指針拷貝操作時,拷貝的是指針的值,拷貝之後,兩個指針是不同的指針,因爲指針可以訪問所指向的對象,所以可以通過修改指針來修改它所指向的值

int n=0,i=42int *p=&n,*q=&i;
*p=42;n的值改變了,p的值不變
p=q;//p指向了i,但i和n的值不變

指針的形參與之類似:
void rest(int *ip)
{
*ip=0;//改變了指針ip所指向的對象
ip=0;//只改變了ip的局部拷貝,實參未被改變
}
調整lreset函數之後,實參所指的對象變爲0,但實參本身沒有改變
int i=42;
reset(&i);只改變了i的值並未改變i的地址
cout<<”i=”<

void reset(int&i)
{
i=0;改變了i所引用對象的值
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章