c++函數和變量

1 c++函數定義 缺省參數

     函數的聲明在定義之前,聲明不需要指明參數名,只有類型,即 T f(T1,T2,...)

    缺省參數從右往左

   當調用函數時,首先開闢一個棧,爲形參和局部變量開闢空間,然後將實參賦值給形參,將函數返回地址放入棧中,最後再跳入函數體內執行。


2 函數的形參和實參的拷貝

    對於變量類型、指針類型的實參,形參是實參的拷貝。對於引用,不會出現拷貝,這對對象進行處理的時候,可以直接使用引用,這樣省去了形參的拷貝構造函數和析構的過程。    

    對於傳值的情況,改變形參的大小,不會影響外部的實參大小。尤其是指針,當改變指針指向的地址時,不會影響實參的大小。對於可以指針和引用,改變指針地址對應的存儲值或者引用對應的值時,可以改變實參大小

例如:

  char getMemory(char *p)

{

   p =new char; 

}

void test()

{

char *a=NULL;

 getM(a);

 strcpy(a,"niha0");

}

這回運行發生錯誤。a只執行完getM後仍然是NULL!

沒有new釋放! 

可以這樣: 

void getMemory(char **p)

{

   *p =new char; 

}

或者:

  char* getMemory()

{

   char *p =new char;

    return p; 

}


3返回值

  對於返回值:不能返回建立在棧上的引用或者指向棧內存的指針指針)。可以返回建立在堆或者是靜態區的指針                           或者引用

           可以返回棧內建立的值(基本數據類型或者對象),這時調用拷貝構造或者賦值函數。

           可以返回本對象*this的引用,無需拷貝。

考慮return 效率:

return string(s1+s2)//創建一個臨時對象,這是直接創建在外部存儲單元的,不需要再進行構造和析夠

string temp(s1+s2);

return temp ;這是不同的過程,下面是temp被創建,然後temp拷貝保存返回值的外部存儲單元,然後temp被銷燬


4函數的重載----在編譯階段確定調用何種函數(C++ primer P208)

    條件:相同的函數名,作用域,只是參數個數或者類型不同。主要僅返回類型不同,不能是重載,是重複定義。

    注意:

   T f(const T &)和T f(T&)屬於重載

   T g(const T*)和T g (T*)屬於重載

 當實參爲非常量的指針/引用,這兩種函數均可以,編譯器會優先選擇不含const的

   T f(const T )和T f(T)       不屬於重載 同一函數

   T g(T* const )和T g (T*)不屬於重載 同一函數


5 各種變量的作用域和生存期:全局 靜態局部/全局 局部變量 

                          作用域                             生存期

全局變量: 定義全局變量的文件,在別的文件中使用需要extern聲明一下     整個程序運行期間      建立在全局區域上,默認初始化爲0

靜態全局變量     只在定義的文件中使用,別的文件不能使用         同上               

靜態局部變量     在定義的函數體內,只初始化一次      同上             

局部變量            在定義的最近的{}內           執行{}           建立在棧上,默認初始化值爲隨機的.


注意

do{

int i=3;

}while(i>0) ----這種是錯誤的,i存在{}內,出了{},不存在該變量名


6各種變量靜態 常量 引用

static T s  :生存期爲整個程序運行期間,值進行一次初始化。

const T c  ;一旦初始化後,且不能再改變。引用

#define T VALUE

注意符號常量和const,在c++中常用const,有數據類型,可以進行類型檢查。

T& y :引用即別名。定義後就立即初始化,且不能再引用別的。


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