Effective C++ 儘可能使用const (上)

本猿認為把知識傳播出去,就應該是用都能理解的方式,故本條款的"儘可能使用const",先介紹概念,然後結合實例來講解。

const概念

const 是 constant 的縮寫,本意是不變的,不易改變的意思。在 C++ 中是用來修飾內置類型變量,自定義對象,成員函數,返回值,函數參數。

C++ const 允許指定一個語義約束,編譯器會強制實施這個約束,允許程序員告訴編譯器某值是保持不變的。如果在編程中確實有某個值保持不變,就應該明確使用const,這樣可以獲得編譯器的幫助。


Effective C++ 儘可能使用const (上)


多才多藝的const

const多才多藝,就不得不說,const可以用在那些地方,有哪些具體的實例,先說可以用到的地方?

  1. const可以用在類(classes)外部修飾global或namespace作用域中的常量,或修飾文件、函數、或區塊作用域(block scope)中被聲明為static的對象。
  2. 可以修飾類內部的static和non-static成員變量。
  3. 針對指針,可以指出指針自身、指針所指物,或兩者都是(或都不是)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修飾,上述代碼就可以編譯通過。

Effective C++ 儘可能使用const (上)

冰山一角而已

const的內容細節很多,上面只是介紹了皮毛部分,更深入的還有更多,本猿先講到這裡,喜歡,感興趣的小夥伴,請持續關注後續更新。。。。


分享到:


相關文章: