1、Define用法:
define主要是用于宏常量定義的,使程序看起來更簡潔明了,方便代碼維護,#define定義的實質只是一個常數的名字,沒有具體數據類型的,沒有分配內存空間。在編譯是會被編譯器替換為該常數。每次使用該宏定義,就要進行編譯并分配空間,若一個程序中多次使用define定義的數據,則就會有多份拷貝。這么做是為了提高程序的可讀性,但安全性相對差點。
2、const用法:
const定義的全局數據變量,其基本作用和define相同,但又在define的基礎上增加了好多功能。const定義的數據在程序開始前就在全局變量區分配了空間,在程序執行的過程中,若用到該數據,直接讀取就可以,沒必要每次進行編譯,整個程序過程中也只有一個拷貝。關于const用法好多,如:
(1)定義常量
const int a=100; //定義a為一個全局數據區常量
const int *a=&i; //定義一個指向常量i的指針,其中*a是不能修改的
int * const a=&i; //定義一個常量指針 ,其中a是不能修改的
const int * const a=&i; //定義一個指向常量i的常量型指針
(2)const修飾函數參數(包括傳值、傳址、引用)
void fun(const int a); //修飾傳值,但這個用法是沒有用的,因為a本身就是要傳入數據的一個拷貝,是另分配的內存,所以對a的改變,對原先數據是沒有影響的
void fun(const int *a); //修飾傳址,要傳入的數據是一個地址,此時若程序中對*a進行修改,則原先的數據也會跟著修改,所以若不想改變原先數據的值,只是希望在函數中引用該數據,則需要加const
void fun(const int &a); //修飾引用,其效用和傳址是一樣的,引用就是給要傳入的數據起了一個別名。
關于修飾引用,下面重點說一下:
當輸入普通數據類型時,不需要加const修飾,因為參數本身就是臨時分配到棧空間的拷貝,但若參數是用戶自定義類型或類時,需要引用傳遞,因為可以提高效率。
void fun(A a); //A為用戶自己定義的類型,這種用法效率低,函數體內產生A類型的臨時對象復制參數a時,該臨時對象的構造、復制、析構過程都將消耗時間。
void fun(const A& a); //這用用法效率高,引用傳遞不需要產生臨時對象,省了臨時對象的構造、復制、析構過程消耗的時間。但光用引用有可能改變a,所以 加const。
class Person {
public:
Person()
{
cout<<"creat person"<<endl;
}
~Person()
{
cout<<"destroy person"<<endl;
}
virtual void fun() const
{
cout<<"hello person"<<endl;
}
};
class Student: public Person {
public:
Student()
{
cout<<"create student"<<endl;
}
~Student()
{
cout<<"desotry student"<<endl;
}
virtual void fun() const
{
cout<<"hello sudent"<<endl;
}
};
bool studentval(Student p)
{
p.fun();
return true;
}
int main(int argc,char *argv[])
{
Student pa;
cout<<endl;
studentval(pa);
cout<<endl;
return 0;
}
另外const修飾引用還可以解決多態中的"切斷"問題,如下面代碼中多態的實現:
class Person {
public:
Person()
{
cout<<"creat person"<<endl;
}
~Person()
{
cout<<"destroy person"<<endl;
}
virtual void fun() const
{
cout<<"hello person"<<endl;
}
};
class Student: public Person {
public:
Student()
{
cout<<"create student"<<endl;
}
~Student()
{
cout<<"desotry student"<<endl;
}
virtual void fun() const //勿丟const
{
cout<<"hello sudent"<<endl;
}
};
bool studentval(Person p)
{
p.fun();
return true;
}
int main(int argc,char *argv[])
{
Student pa;
cout<<endl;
studentval(pa);
cout<<endl;
return 0;
}
(3)const修飾成員函數
void fun(int a) const
(4)const修飾函數返回值
const int *fun(int a)
3、static用法:
函數內部定義的變量,在程序執行到它的定義處時,編譯器為它在棧上分配空間,大家知道,函數在棧上分配的空間在此函數執行結束時會釋放掉,這樣就產生了一個問題: 如果想將函數中此變量的值保存至下一次調用時,如何實現?最容易想到的方法是定義一個全局的變量,但定義為一個全局變量有許多缺點,最明顯的缺點是破壞了此變量的訪問范圍(使得在此函數中定義的變量,不僅僅受此函數控制)。因此C++ 中引入了靜態變量static,用它來修飾變量,它能夠指示編譯器將此變量在程序的靜態存儲區分配空間保存,這樣即實現了目的,又使得此變量的存取范圍不變。
對于局部變量而言,static改變了變量的存儲方式,使其變為靜態存儲,連接方式是內部連接(只能在該文件中使用,局部變量本來就是內部連接了),即局部變量只改變存儲方式,不改變連接方式。對于全局變量而言,則不改變存儲方式(全局變量已經是靜態存儲了),它僅改變其連接類型,全局變量默認是外聯的,即能被其他外部文件直接使用,只需提前聲明extern,若加上static,則只能在本文件使用,即全局變量只改變連接方式,不改變存儲方式。
|
新聞熱點
疑難解答
圖片精選