我考,我信心苦苦碼了這麼多次,加上自己見解,好好的寫了很多,結果最後發布時居然。。。。沒成功。
然後我那可憐的字都沒了,我哭,
噴血的儲存,寫了這麼長時間的東西就這麼沒了
這次沒耐心了,只能賦值其他的有點用的拉上去了。。。。
char *p = "hello"; // 非const指標,
// 非const資料
const char *p = "hello"; // 非const指標,
// const資料
char * const p = "hello"; // const指標,
// 非const資料
const char * const p = "hello"; // const指標,
// const資料
記住的方法,除去型別名即char ,然後看下const修飾的是什麼
const char *p = "hello"; const修飾*p,即修飾p指向的內容資料 ,const資料
char * const p = "hello"; const修飾p,即修飾p指標本身。const指標
在指標所指為常量的情況下,有些程式設計師喜歡把const放在型別名之前,有些程式設計師則喜歡把const放在型別名之後、星號之前。所以,下面的函式取的是同種引數型別:
class widget ;
void f1(const widget *pw); // f1取的是指向
// widget常量物件的指標
void f2(widget const *pw); // 同f2
因為兩種表示形式在實際**中都存在,所以要使自己對這兩種形式都習慣。
const的一些強大的功能基於它在函式宣告中的應用。在乙個函式宣告中,const可以指的是函式的返回值,或某個引數;對於成員函式,還可以指的是整個函式。
const成員函式的目的當然是為了指明哪個成員函式可以在const物件上被呼叫。但很多人忽視了這樣乙個事實:僅在const方面有不同的成員函式可以過載。這是c++的乙個重要特性。再次看這個string類:
class string
// 用於const物件的operator
const char& operator(int position) const
private:
char *data;
};string s1 = "hello";
cout << s1[0]; // 呼叫非const
// string::operator
const string s2 = "world";
cout << s2[0]; // 呼叫const
// string::operator
通過過載operator並給不同版本不同的返回值,就可以對const和非const string進行不同的處理:
string s = "hello"; // 非const string物件
cout << s[0]; // 正確——讀乙個
// 非const string
s[0] = 'x'; // 正確——寫乙個
// 非const string
const string cs = "world"; // const string 物件
cout << cs[0]; // 正確——讀乙個
// const string
cs[0] = 'x'; // 錯誤!——寫乙個
// const string
另外注意,這裡的錯誤只和呼叫operator的返回值有關;operator呼叫本身沒問題。 錯誤產生的原因在於企圖對乙個const char&賦值,因為被賦值的物件是const版本的operator函式的返回值。
還要注意,非const operator的返回型別必須是乙個char的引用——char本身則不行。如果operator真的返回了乙個簡單的char,如下所示的語句就不會通過編譯:
s[0] = 'x';
因為,修改乙個「返回值為固定型別」的函式的返回值絕對是不合法的。即使合法,由於c++「通過值(而不是引用)來返回物件」(見條款22)的內部機制的原因,s.data[0]的乙個拷貝會被修改,而不是s.data[0]自己,這就不是你所想要的結果了。
一般用const修飾返回值為物件本身的情況多用於二目操作符過載函式並產生新物件的時候。
[總結] 一般情況下,函式的返回值為某個物件時,如果將其宣告為const時,多用於操作符的過載。通常,不建議用const修飾函式的返回值型別為某個物件或對某個物件引用的情況。
原因如下:
如果返回值為某個物件為const或某個物件的引用為const ,則返回值具有const屬性,則返回例項只能訪問類a中的公有資料成員和const成員函式,並且不允許對其進行賦值操作,這在一般情況下很少用到。
const 限定函式的值型返回值:
const int fun1();
const myclass fun2();
分析:上述寫法限定函式的返回值不可被更新,當函式返回內部的型別時(如fun1),已經是乙個數值,當然不可被賦值更新,所以,此時const無意義, 最好去掉,以免困惑。當函式返回自定義的型別時(如fun2),這個型別仍然包含可以被賦值的變數成員,所以,此時有意義。
使用const的一些建議
1 要大膽的使用const,這將給你帶來無盡的益處,但前提是你必須搞清楚原委;
2 要避免最一般的賦值操作錯誤,如將const變數賦值,具體可見思考題;
3 在引數中使用const應該使用引用或指標,而不是一般的物件例項,原因同上;
4 const在成員函式中的三種用法要很好的使用;
5 不要輕易的將函式的返回值型別定為const;
6 除了過載操作符外一般不要將返回值型別定為對某個物件的const引用;
FTGL庫初步剖析
ftgl庫是乙個跨作業系統平台的在opengl下用來渲染文字的開源庫,其內部使用了freetype2庫來處理字型相關,採用物件導向的程式設計風格,提供這種方式渲染文字,包括 bitmap方式 texture方式 polygon方式 ouline方式 extrude方式 pixmap方式 buffer...
c 中const用法大全與實質剖析
c 中const用法大全與實質剖析 在c 中,const是定義乙個常量,意味著不能更改,相當於唯讀狀態,它能修飾基本資料型別,方法,類型別等,具體用法如下所示。1.修飾基本資料型別,代表此變數無法更改,即常量,用法如下。const int a 10 int const b 20 注 兩種用法相同,且...
C語言與C 語言中Const的特性剖析
include using namespace std int main 我們看到了,c 中的const限制了來自 從變數本身改變變數的值與從變數指標強制改變變數的值 的威脅。c 中的const型別的變數真正做到了 無法被修改 的特性,被const修改的變數也因此變為了 真正的常量 include ...