你所不知道的 const

2021-06-20 04:49:35 字數 3497 閱讀 4843

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...