• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • [ 補充 ] 用 const 限定類的成員函數

    發表于:2007-05-25來源:作者:點擊數: 標簽:限定quote補充Const成員
    [quote:13bb3b6588="yuxq"]... 5. const限定類的成員函數: classclassname{ public: intfun()const; ..... } 注意:采用此種const后置的形式是一種規定,亦為了不引起混淆。在此函數的聲明中和定義中均要使用const,因為const已經成為類型信息的一部分。 獲

    [quote:13bb3b6588="yuxq"]...
    5. const 限定類的成員函數:

    class classname {
     public:
      int fun() const;
     .....
    }

      注意:采用此種const 后置的形式是一種規定,亦為了不引起混淆。在此函數的聲明中和定義中均要使用const,因為const已經成為類型信息的一部分。

    獲得能力:可以操作常量對象。

    失去能力:不能修改類的數據成員,不能在函數中調用其他不是const的函數。
    [/quote:13bb3b6588]

    原帖請見 [url]http://www.chinaunix.net/forum/viewtopic.php?t=143183[/url]

    樓主的這篇文章值得仔細閱讀。但是,我覺得上述“const 限定類的成員函數”這一部分寫得比較簡略,特別是其中“注意”后面的文字,更是使人不知所云,所以想對這一部分做一些補充說明。

    類的成員函數后面加 const,表明這個函數不會對這個類對象的數據成員(準確地說是非靜態數據成員)作任何改變。

    在設計類的時候,一個原則就是對于不改變數據成員的成員函數都要在后面加 const,而對于改變數據成員的成員函數不能加 const。所以 const 關鍵字對成員函數的行為作了更加明確的限定:有 const 修飾的成員函數(指 const 放在函數參數表的后面,而不是在函數前面或者參數表內),只能讀取數據成員,不能改變數據成員;沒有 const 修飾的成員函數,對數據成員則是可讀可寫的。

    除此之外,在類的成員函數后面加 const 還有什么好處呢?樓主告訴我們的:“獲得能力:可以操作常量對象”,其實應該是常量(即 const)對象可以調用 const 成員函數,而不能調用非const修飾的函數。正如非const類型的數據可以給const類型的變量賦值一樣,反之則不成立。

    對于const成員函數,"不能修改類的數據成員,不能在函數中調用其他不是const的函數",這是由const的屬性決定的,樓主說得完全正確。

    請看下面一個完整的例子,然后我再作一些說明。
    [code:1:13bb3b6588]
    #include <iostream> 
    #include <string> 
    using namespace std; 
     
    class Student { 
    public: 
      Student() {} 
      Student( const string& nm, int sc = 0 ) 
        : name( nm ), score( sc ) {} 
     
      void set_student( const string& nm, int sc = 0 ) 
      { 
        name = nm; 
        score = sc; 
      } 
     
      const string& get_name() const 
      { 
        return name; 
      } 
     
      int get_score() const 
      { 
        return score; 
      } 
     
    private: 
      string name; 
      int score; 
    }; 

    // output student's name and score 
    void output_student( const Student& student ) 

      cout << student.get_name() << "\t"; 
      cout << student.get_score() << endl; 

     
    int main() 

      Student stu( "Wang", 85 ); 
      output_student( stu ); 
    }
    [/code:1:13bb3b6588]

    設計了一個類 Student,數據成員有 name 和 score,有兩個構造函數,有一個設置成員數據函數 set_student(),各有一個取得 name 和 score 的函數 get_name() 和 get_score()。請注意 get_name() 和 get_score() 后面都加了 const,而 set_student() 后面沒有(也不能有const)。

    首先說一點題外話,為什么 get_name() 前面也加 const。如果沒有前后兩個 const 的話,get_name() 返回的是對私有數據成員 name 的引用,所以通過這個引用可以改變私有成員 name 的值,如
    [code:1:13bb3b6588]  Student stu( "Wang", 85 );
      stu.get_name() = "Li";
    [/code:1:13bb3b6588]
    即把 name 由原來的 "Wang" 變成了 "Li",而這不是我們希望的發生的。所以在 get_name() 前面加 const 避免這種情況的發生。

    那么,get_name() 和 get_score() 這兩個后面應該加 const的成員函數,如果沒有 const 修飾的話可不可以呢?回答是可以!但是這樣做的代價是:const對象將不能再調用這兩個非const成員函數了。如
    [code:1:13bb3b6588]const string& get_name(); // 這兩個函數都應該設成 const 型
    int get_score();
    void output_student( const Student& student ) 

      cout << student.get_name() << "\t"; // 如果 get_name() 和 get_score() 是非const成員函數,這一句和下一句調用是錯誤的
      cout << student.get_score() << endl; 
    }
    [/code:1:13bb3b6588]
    由于參數student表示的是一個對const Student型對象的引用,所以 student 不能調用非const成員函數如 set_student()。如果 get_name() 和 get_score() 成員函數也變成非const型,那么上面的 student.get_name() 和 student.get_score() 的使用就是非法的,這樣就會給我們處理問題造成困難。

    因此,我們沒有理由反對使用const,該加const時就應該加上const,這樣使成員函數除了非const的對象之外,const對象也能夠調用它。

     flw 回復于:2004-04-10 06:47:50
    收為精華

     yangpan1984 回復于:2004-04-17 19:42:16
    這篇應被評為精華

     cym9999 回復于:2004-04-25 15:54:13
    :em02: 非常好

     zhangwei_jef 回復于:2004-04-25 16:28:24
    對const的作用寫的很不錯,頂

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>