本猿認為把知識傳播出去,就應該是用都能理解的方式,故本條款的"儘可能使用const",先介紹概念,然後結合實例來講解。
const概念
const 是 constant 的縮寫,本意是不變的,不易改變的意思。在 C++ 中是用來修飾內置類型變量,自定義對象,成員函數,返回值,函數參數。
C++ const 允許指定一個語義約束,編譯器會強制實施這個約束,允許程序員告訴編譯器某值是保持不變的。如果在編程中確實有某個值保持不變,就應該明確使用const,這樣可以獲得編譯器的幫助。
多才多藝的const
const多才多藝,就不得不說,const可以用在那些地方,有哪些具體的實例,先說可以用到的地方?
- const可以用在類(classes)外部修飾global或namespace作用域中的常量,或修飾文件、函數、或區塊作用域(block scope)中被聲明為static的對象。
- 可以修飾類內部的static和non-static成員變量。
- 針對指針,可以指出指針自身、指針所指物,或兩者都是(或都不是)const。
下面是一些代碼示例:
<code>#include <iostream>namespace EX { const int c = 8; // const修飾namespace中的變量}const int g_var = 9; // const 修飾 global域中的變量class example {private: static const int m_a = 1; //const 修飾class中的static變量};int main() { int a = 5; const int b = 6; //const 修飾 b a = 0; b = 7; //編譯器報錯,編譯不通過}/<iostream>/<code>
第三點很重要,很多人容易迷糊,分不清const修飾的是指針還是指針所指物。關鍵記住下面小技巧,看清關鍵字const出現在星號*的位置,出現在星號左邊,表示被指物是常量;在星號的右邊,表示指針本身是常量。
如下示例:
<code>char greeting[] = "Hello";char* p = greeting; //non-const pointer, non-const dataconst char* p = greeting; //non-const pointer, const datachar* const p = greeting; //const pointer, non-const dataconst char* const p = greeting; //const pointer, const data/<code>
const重要應用地方
用於修飾函數:
當我們編寫函數時,希望傳入的參數或指針所指物的內容不被修改,或者返回值保持常量性,就需要用到const,這個時候const就很有用了。下面的例子:
<code>void f1( const Widget* pw);class Rational { ... };const Rational operator* (const Rational& lhs, const Rational& rhs); // 返回值用const修飾/<code>
很多小白,看到這裡的代碼可能都不會太注意,返回值用const修飾,為什麼呢?那假如不是const修飾,你看下下面的代碼是不是就可以為所欲為了;
<code>Rational a, b, c;...(a * b) = c; //在a * b的成果上調用operator=/<code>
正常情況,用const修飾的上述代碼,編譯器會報錯,不用const修飾,上述代碼就可以編譯通過。
const的內容細節很多,上面只是介紹了皮毛部分,更深入的還有更多,本猿先講到這裡,喜歡,感興趣的小夥伴,請持續關注後續更新。。。。
閱讀更多 Jason攻城獅 的文章