[C++] Ce este o functie constanta?

Despre limbajul de programare C++ si biblioteca standard STL (forum moderat)
Post Reply
User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

[C++] Ce este o functie constanta?

Post by Ovidiu Cucu » 08 Jul 2011, 10:44

Intrebare
Ce este o functie constanta (declarata cu const)?

Raspuns
O functie constanta nu poate modifica obiectul prin care a fost apelata.

Exemplu [1]

Code: Select all

class A
{
   int m;
   void f() const
   {
      // attempt to modify this object
      m = 1; // Error
   }
};
Alfel spus, specificatorul const face ca poiterul this din corpul functiei sa fie de tip pointer to const.
In exemplul echivalent [2], functia A::f foloseste pointerul this pentru a ilustra acest lucru.
Exemplu [2]

Code: Select all

class A
{
   int m;
   void f() const
   {
      (*this).m = 1; // Error (l-value specifies const object)
   }
};
Note
  1. Practic, orice caz care poate modifica obiectul chiar indirect, genereaza o eroare de compilare.
    Doua exemple:
    • Exemplu [3]

      Code: Select all

      class A
      {
         void g();
         void f() const
         {
            // call non-static, non-const member function
            g(); // Error
         }
      };
    • Exemplu [4]

      Code: Select all

      class A
      {
         A& f() const
         {
            // return non-const reference to this object
            return *this; // Error
         }
      };
  2. Un membru declarat mutable poate fi modificat oricum, inclusiv din functii const.
    Exemplu [5]

    Code: Select all

    class A
    {
       mutable int m;
       void f() const
       {
          // modify 'mutable' member
          m = 1; // OK
       }
    };
  3. Trebuie amintita "fenta" numita casting away const-ness, adica folositea de const_cast sau C-style cast pentru a transforma o referinta constanta sau un pointer la un obiect constant. In general, aceasta trebuie evitata din doua motive:
    • incercarea de a modifica un obiect constant cade in categoria undefined behavior deci este riscanta.
    • daca o functie a fost declarata const indeamna ca a existat un motiv intemeiat; daca nu, inseamna ca s-a gresit la design.

    Exemplu [6]

    Code: Select all

    class A
    {
       A& f() const
       {
          // apply casting away const-ness to return non-const reference to this object
          return const_cast<A&>(*this); // No error but NOT OK.
       }
    };
Vezi si



Post Reply