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 :引用即別名。定義後就立即初始化,且不能再引用別的。