נושאים פעיליםנושאים פעילים  הצגת רשימה של חברי הפורוםרשימת משתמשים  חיפוש בפורוםחיפוש  עזרהעזרה
  הרשמההרשמה  התחברותהתחברות RSS עדכונים
תיכנות
RSS UnderWarrior Forums : RSS תיכנות
נושא

נושא: c++

שליחת תגובהשליחת נושא חדש
כותב
הודעה << נושא קודם | נושא הבא >>
incognito
משתמש מתחיל
משתמש מתחיל


הצטרף / הצטרפה: 31 January 2007
משתמש: מנותק/ת
הודעות: 13
נשלח בתאריך: 31 January 2007 בשעה 16:53 | IP רשוּם
ציטוט incognito

שלום.

שימוש ב const ב  c++.

לפי הבנתי ברגע שמשתמשים ב const לא ניתן לשנות את הערך של המשתנה.

מתי אני אשתמש ב const ומתי לא?

למשל:

אם אני כותב את הפונקציה הבאה:

      void AddPoint( const Point pt ) { //1

        InvalidateArea();

        points_.push_back(pt);

      }

אני לא צריך את ה const כיוון שאני מעביר by value ואין שום סיבה לעשות const. אז ניתן למחוק אותו.

 עכשיו אני אוביף כמה מקרים שתיקנו את הקוד. אני מאוד אשמח עם מישהו יוכל לאמר לי מה הסיבה לתיקון הקוד (הורדת או הוספת const(

מקרה 1

 

Point GetPoint( const int i ) { // 2, 3, 4

        return points_;

      }

פתרון 1

      const Point GetPoint(int i) const { return points_; }

 

 

מקרה 2

 

      int GetNumPoints() { //5

        return points_.size();

      }

פתרון 2

int   GetNumPoints() const { return points_.size(); }

 

מקרה 3

      double GetArea() { //6

        if( area_ < 0 ) // if not yet calculated and cached

          CalcArea();     // calculate now

        return area_;

        }

פתרון 3

      double GetArea() const {

            if(   area_ <     0 )   // if not yet calculated and cached

                  CalcArea();       // calculate now

            return area_;

      }

 

מקרה 4

void InvalidateArea() { area_ = -1; } //7

פתרון 4

      void InvalidateArea() const   { area_     = -1; }

 

מקרה 5

void CalcArea() { //8

        area_ = 0;

        vector<Point>::iterator i; //9

        for( i = points_.begin(); i != points_.end(); ++i )

          area_ += /* some work */;

      }

 

 

פתרון 5

 

void CalcArea()   const {

            area_ =     0;

            vector<Point>::const_iterator i;

            for( i = points_.begin(); i   != points_.end(); ++i )

                  area_ += /* some work */;

      }

 

מקרה 6

Polygon operator+( Polygon& lhs, Polygon& rhs ) { //10, 11

      Polygon ret = lhs;

      int last = rhs.GetNumPoints(); //12

      for( int i = 0; i < last; ++i ) // concatenate

        ret.AddPoint( rhs.GetPoint(i) ); //12a

      return ret;

    }

 

פתרון 6

const Polygon operator+( const Polygon&   lhs, const Polygon& rhs ) {

      Polygon     ret   = lhs;

      const int last = rhs.GetNumPoints();

      for( int i = 0;   i <   last; ++i ) // concatenate

            ret.AddPoint( rhs.GetPoint(i) );

    return ret;

}

 

מקרה 7

void f( const Polygon& poly ) { //12b

      const_cast<Polygon&>(poly).AddPoint( Point(0,0) );

    }

 

    void g( Polygon& const rPoly ) { //13

      rPoly.AddPoint( Point(1,1) );

    }

 

    void h( Polygon* const pPoly ) { //14

      pPoly->AddPoint( Point(2,2) );

    }

 

פתרון 7

 

void f(Polygon& poly )  {poly.AddPoint(Point(0,0) );}

 

void g(Polygon& rPoly ) { rPoly.AddPoint(Point(1,1) ); }

 

void h(Polygon* pPoly ) { pPoly->AddPoint(Point(2,2) ); }

 

 

תודה

חזרה לתחילת העמוד הצג את כרטיס החבר של incognito חפש הודעות אחרות של incognito
 
SBD
פורומיסט על
פורומיסט על
סמל אישי

הצטרף / הצטרפה: 13 January 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 1194
נשלח בתאריך: 31 January 2007 בשעה 23:51 | IP רשוּם
ציטוט SBD

CONST לא נחשב משתנה. הוא קובע.

במידה ואתה שם בו הפניה לעצם אז הוא בעצם מקבל כתובת זכרון, מה שאומר שאתה יכול עדין לשנות את התכונות של העצם אבל לא לשנות את הכתובת של הזכרון שנמצא ב-CONST. כלומר לשנות את ההפניה שלו לעצם אחר.

זה ממש לא יהיה קריטי אם תשתמש או לא תשתמש ב-CONT ברוב המקרים. זה בעיקר לנוחות המשתמש. ואם אני לא טעוה אז רק הקומפיילר מתייחס לזה. לפחות ככה זה היה פעם, לא יודע בוודאותא יך זה היום אז לא רוצה סתם להטעות אותך. גדולים ממני יגידו ;)


__________________
~ Nobody Is Perfect, I'm Nobody ~
פורומים
חזרה לתחילת העמוד הצג את כרטיס החבר של SBD חפש הודעות אחרות של SBD בקר בדף הבית של SBD
 
incognito
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 03 February 2007 בשעה 20:24 | IP רשוּם
ציטוט incognito

אבל למה נעשו השינויים בקוד שהצגתי

אתה יכול להסביר?

חזרה לתחילת העמוד הצג את כרטיס החבר של incognito חפש הודעות אחרות של incognito בקר בדף הבית של incognito
 
אלצ'קו
אחראי פורומים
אחראי פורומים
סמל אישי
ג2ר פ33תי

הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת
הודעות: 609
נשלח בתאריך: 03 February 2007 בשעה 21:58 | IP רשוּם
ציטוט אלצ'קו

קשה לראות מה המקור ומה התיקון, אבל בגדול יש גישה חזקה שאומרת שצריך לכתוב const בכל מקום אפשרי, ולהוריד רק היכן שדרוש כדי לממש פונקציונאליות.
חזרה לתחילת העמוד הצג את כרטיס החבר של אלצ'קו חפש הודעות אחרות של אלצ'קו
 

אם ברצונך להגיב לנושא זה עליך קודם להתחבר
אם אינך רשום/ה כבר עליך להרשם

  שליחת תגובהשליחת נושא חדש
גרסת הדפסה גרסת הדפסה

קפיצה לפורום
אינך יכול/ה לשלוח נושאים חדשים בפורום זה
אינך יכול/ה להגיב לנושאים בפורום זה
אינך יכול/ה למחוק את הודעותיך ותגוביך בפורום זה
אינך יכול/ה לערוך את הודעותיך ותגובותיך בפורום זה
אינך יכול/ה לצור סקרים בפורום זה
אינך יכול/ה להצביע בסקרים בפורום זה