Define,const,static用法總結(jié)
1、Define用法:
define主要是用于宏常量定義的,使程序看起來(lái)更簡(jiǎn)潔明了,方便代碼維護(hù),#define定義的實(shí)質(zhì)只是一個(gè)常數(shù)的名字,沒(méi)有具體數(shù)據(jù)類型的,沒(méi)有分配內(nèi)存空間。在編譯是會(huì)被編譯器替換為該常數(shù)。每次使用該宏定義,就要進(jìn)行編譯并分配空間,若一個(gè)程序中多次使用define定義的數(shù)據(jù),則就會(huì)有多份拷貝。這么做是為了提高程序的可讀性,但安全性相對(duì)差點(diǎn)。
2、const用法:
const定義的全局?jǐn)?shù)據(jù)變量,其基本作用和define相同,但又在define的基礎(chǔ)上增加了好多功能。const定義的數(shù)據(jù)在程序開始前就在全局變量區(qū)分配了空間,在程序執(zhí)行的過(guò)程中,若用到該數(shù)據(jù),直接讀取就可以,沒(méi)必要每次進(jìn)行編譯,整個(gè)程序過(guò)程中也只有一個(gè)拷貝。關(guān)于const用法好多,如:
(1)定義常量
const int a=100; //定義a為一個(gè)全局?jǐn)?shù)據(jù)區(qū)常量
const int *a=&i; //定義一個(gè)指向常量i的指針,其中*a是不能修改的
int * const a=&i; //定義一個(gè)常量指針 ,其中a是不能修改的
const int * const a=&i; //定義一個(gè)指向常量i的常量型指針
(2)const修飾函數(shù)參數(shù)(包括傳值、傳址、引用)
void fun(const int a); //修飾傳值,但這個(gè)用法是沒(méi)有用的,因?yàn)閍本身就是要傳入數(shù)據(jù)的一個(gè)拷貝,是另分配的內(nèi)存,所以對(duì)a的改變,對(duì)原先數(shù)據(jù)是沒(méi)有影響的
void fun(const int *a); //修飾傳址,要傳入的數(shù)據(jù)是一個(gè)地址,此時(shí)若程序中對(duì)*a進(jìn)行修改,則原先的數(shù)據(jù)也會(huì)跟著修改,所以若不想改變?cè)葦?shù)據(jù)的值,只是希望在函數(shù)中引用該數(shù)據(jù),則需要加const
void fun(const int &a); //修飾引用,其效用和傳址是一樣的,引用就是給要傳入的數(shù)據(jù)起了一個(gè)別名。
關(guān)于修飾引用,下面重點(diǎn)說(shuō)一下:
當(dāng)輸入普通數(shù)據(jù)類型時(shí),不需要加const修飾,因?yàn)閰?shù)本身就是臨時(shí)分配到??臻g的拷貝,但若參數(shù)是用戶自定義類型或類時(shí),需要引用傳遞,因?yàn)榭梢蕴岣咝省?br>
void fun(A a); //A為用戶自己定義的類型,這種用法效率低,函數(shù)體內(nèi)產(chǎn)生A類型的臨時(shí)對(duì)象復(fù)制參數(shù)a時(shí),該臨時(shí)對(duì)象的構(gòu)造、復(fù)制、析構(gòu)過(guò)程都將消耗時(shí)間。
void fun(const A& a); //這用用法效率高,引用傳遞不需要產(chǎn)生臨時(shí)對(duì)象,省了臨時(shí)對(duì)象的構(gòu)造、復(fù)制、析構(gòu)過(guò)程消耗的時(shí)間。但光用引用有可能改變a,所以 加const。
#include <iostream>
#include <string>
using namespace std;
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;
}
分析:首先聲明Student pa時(shí)進(jìn)行了兩次構(gòu)造函數(shù)(student和person),再調(diào)用studentval(pa)函數(shù)時(shí),需要?jiǎng)?chuàng)建pa的臨時(shí)變量,即調(diào)用了兩次拷貝構(gòu)造函數(shù)(student和person),但該函數(shù)結(jié)束后,創(chuàng)建的臨時(shí)變量銷毀,調(diào)用了兩次析構(gòu)函數(shù),而當(dāng)main函數(shù)結(jié)束后,pa銷毀又調(diào)用了兩次構(gòu)造函數(shù)。共調(diào)用了8次函數(shù)。若改為引用傳遞,及函數(shù)改為:
bool studentval(const Student& p)
{
p.fun();
return true;
}
因?yàn)橐脗鬟f時(shí)沒(méi)有構(gòu)造臨時(shí)變量,也就不需要另外進(jìn)行構(gòu)造和析構(gòu)了,就整個(gè)函數(shù)過(guò)程只需要4次調(diào)用。
另外const修飾引用還可以解決多態(tài)中的"切斷"問(wèn)題,如下面代碼中多態(tài)的實(shí)現(xiàn):
#include <iostream>
#include <string>
using namespace std;
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;
}
按理說(shuō)調(diào)用studentval(Person p),當(dāng)傳入Student類型的時(shí)候,按照多態(tài)應(yīng)該顯示的student的內(nèi)容,即顯示"hello stuent",但結(jié)果顯示的卻是"hello person",說(shuō)明被切斷了,若改為bool studentval(const Person &p)時(shí),便解決了該問(wèn)題。
(3)const修飾成員函數(shù)
void fun(int a) const
(4)const修飾函數(shù)返回值
const int *fun(int a)
3、static用法:
函數(shù)內(nèi)部定義的變量,在程序執(zhí)行到它的定義處時(shí),編譯器為它在棧上分配空間,大家知道,函數(shù)在棧上分配的空間在此函數(shù)執(zhí)行結(jié)束時(shí)會(huì)釋放掉,這樣就產(chǎn)生了一個(gè)問(wèn)題: 如果想將函數(shù)中此變量的值保存至下一次調(diào)用時(shí),如何實(shí)現(xiàn)?最容易想到的方法是定義一個(gè)全局的變量,但定義為一個(gè)全局變量有許多缺點(diǎn),最明顯的缺點(diǎn)是破壞了此變量的訪問(wèn)范圍(使得在此函數(shù)中定義的變量,不僅僅受此函數(shù)控制)。因此C++ 中引入了靜態(tài)變量static,用它來(lái)修飾變量,它能夠指示編譯器將此變量在程序的靜態(tài)存儲(chǔ)區(qū)分配空間保存,這樣即實(shí)現(xiàn)了目的,又使得此變量的存取范圍不變。
對(duì)于局部變量而言,static改變了變量的存儲(chǔ)方式,使其變?yōu)殪o態(tài)存儲(chǔ),連接方式是內(nèi)部連接(只能在該文件中使用,局部變量本來(lái)就是內(nèi)部連接了),即局部變量只改變存儲(chǔ)方式,不改變連接方式。對(duì)于全局變量而言,則不改變存儲(chǔ)方式(全局變量已經(jīng)是靜態(tài)存儲(chǔ)了),它僅改變其連接類型,全局變量默認(rèn)是外聯(lián)的,即能被其他外部文件直接使用,只需提前聲明extern,若加上static,則只能在本文件使用,即全局變量只改變連接方式,不改變存儲(chǔ)方式。
上一篇:typedef和#define的用法以及區(qū)別
欄 目:C語(yǔ)言
下一篇:構(gòu)造函數(shù)定義為private或者protected的好處
本文標(biāo)題:Define,const,static用法總結(jié)
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4023.html
您可能感興趣的文章
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入const int *p與int * const p的區(qū)別詳解(常量指針與指向常量的指
- 01-10undefined reference to `SetPduPowerConsumptionCnt'錯(cuò)誤的解決方法
- 01-10C語(yǔ)言static修飾函數(shù)詳細(xì)解析
- 01-10c語(yǔ)言中static的用法詳細(xì)示例分析
- 01-10解析static在C和C++中的用法以及區(qū)別
- 01-10c_str()的用法詳細(xì)解析
- 01-10關(guān)于C/C++中static關(guān)鍵字的作用總結(jié)
- 01-10C++中四種對(duì)象生存期和作用域以及static的用法總結(jié)分析
- 01-10C語(yǔ)言 volatile與const同時(shí)使用應(yīng)注意的問(wèn)題


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子