const 常量是不可修改的,也就是說only read,例如
const int nbuffsize = 512;
nbuffsize = 0; //error
就是因為const 常量不能修改,所以定義時必須初始化預設在全域性作用域中定義的非const變數可以在整個程式中訪問,例如
int ncounter;
extern int ncounter;
++ncounter;
但是在全域性作用域中宣告的const變數是定義的檔案區域性變數,只能被該檔案使用,不能被其他檔案使用。可以通過指定const變數為extern,就可以在全域性中使用,如下
extern const int ncounter = 1024;
extern int ncounter;
非const變數預設為extern,要使const變數能夠在其他檔案中訪問,必須顯示地指定它為extern
先看下面的例子
const int *p;
int * const p;
第乙個就是指向的內容為const,而第二個是指標為const
const int nbuff = 42;
const void* pv1 = & nbuff;
void * pv2 = &nbuff; //error
當使用非const物件初始化const物件的引用時,可以將非const物件轉換為const物件,如下
int nvala = 10;
const int nvalb = 0;
const int &nvalc = nvala;
const int *pvald = &nvalb;
當要使用非const變數初始化const變數,必須要將非const變數初始化,如下
int ival = 123;
const int m = ival;
const_cast就是隱式轉換掉表示式的const性質,假設有函式string_copy,我們對其char*引數唯讀不寫
const char* pc_str = "hello world!";
char* pc = string_copy(const_cast(pc_str));
1)在呼叫函式的時候,如果函式使用非引用的非const形參,則可以傳遞const實參也可以額傳遞非const實參,如下:
int func(int, int);
const int nval1 = 3, nval2 = 6;
int nval3 = 12, nval4 = 13;
int nresult1 = func(nval1, nval2);
int nresult2 = func(nval3, nval4);
傳遞的實參型別為const int的呼叫,因為初始化複製了形參的值,可用const物件初始化非const物件,反之亦然。
2)如果將形參定義為非引用的const型別,不可以改變實參的區域性副本,由於實參仍是以副本的形式傳遞,因此傳遞給函式的既可以是const物件也可以是非const物件。利用const引用形參可以避免複製實參,因為對於大部分的類型別或者大型陣列,複製的效率太低下了,使用引用形參可以直接訪問實參物件,而無需複製它,如下
int getsqlistelem(const sqlist &l, const elemtype data); //得到線性表中資料為data的第乙個索引位置
第個形參可以避免複製結構體l,使用const引用可以避免複製,同時避免修改實參參值,第二個雖然使用了const 但是沒有使用引用,所以還是會複製實參
在普通的非const成員函式中,this的型別是乙個指向類型別的const指標,為什麼指標是const?因為當前物件已經確定,改變指標的值就是改變指向的物件。在const成員函式中,this指標是乙個指向const類型別的const指標,也就是說指標不能改變,同時指向的內容也不能改變,也就是說不能改變物件的成員和函式,只能獲取成員的值或者函式等,如下:
/*注意const成員函式的*this返回值為const screen*/
const screen& screen::display(ostream& os) const
注意這裡返回的是*this,就是const screen
const物件只能使用const成員,非const物件可以使用任一成員。如下:
public:
//過載函式
screen& display(ostream& os); // 可以使用任何成員
const screen& display(ostream& os) const; //只能使用const成員
private:
void do_display(ostream& os) const;
如下呼叫string str = "abcdefg";
screen myscreen(str, 0, 5); //棧上分配的空間
const screen constscreen(str, 0, 4);
myscreen.display(cout);
constscreen.display(cout);
這裡除錯一下,就會發現const版本的就只會呼叫const函式建構函式不能宣告為const,因為建構函式就是要初始化類,如果宣告為const就無法初始化
public:
sales_item(void) const;
這樣編譯的話就會出錯
一般,類的static成員,是不能在類的定義體中初始化,相反static資料成員通常在定義時初始化,整型const static資料成員就可以在類的定義體中進行初始化:
typedef double money;
class account
; ~account(){};
money balance()
static double rate()
static void rate(double);
private:
typedef long double money;
money bal;
static double interestrate;
static const int period = 30;
double daily_tbl[period];
};
const static資料成員在類的定義體中初始化時,該資料成員仍必須在類的定義體外進行定義,在類內部指定初始化值,成員的定義不必再指定初始值,如下
const int account::period;
你所不知道的background
今天要說說css中background這個屬性裡面的大學問。在乙個宣告中設定所有的背景屬性 body 看到這串 你怕了嗎?知道他們都代表啥意思嘛?不要捉急,來看展開式。展開式 background color設定元素的背景顏色,不能設定到外邊距,可以繼承父級的背景顏色,預設為透明。backgroun...
overflow hidden 你所不知道的事
overflow hidden 你所不知道的事 overflow hidden這個css樣式是大家常用到的css樣式,但是大多數人對這個樣式的理解僅僅侷限於隱藏溢位,而對於清除浮動這個含義不是很了解。這是乙個常用的div寫法,下面我們來書寫樣式。大家可以在dmx中自己做試驗 wai nei 可以看到...
你所不知道的 Console
1.凡人視角 列印字串 console.log i am a 凡人 列印提示訊息 console.info yes,you arm a 凡人 列印警告訊息 console.warn 凡人你居然敢窺視我 列印錯誤訊息 console.error 天兵天將,把這個凡人給我打入地獄 列印除錯資訊 cons...