Sobes.tech
Junior

Ko jūs zināt par konstantiem un nekonstantiem metodēm?

sobes.tech AI

Atbilde no AI

Konstantās metodes (const methods) C++ ir klases metodes, kuras ir deklarētas ar atslēgas vārdu const pēc parametru saraksta.

class MyClass {
public:
    void nonConstMethod();         // Nekonstanta metode
    void constMethod() const;      // Konstanta metode
};

Atslēgas vārds const pēc parametru saraksta garantē, ka metode nemainīs objekta stāvokli, kuram tā ir izsaukta. Tas nozīmē, ka iekšā konstantajā metodē:

  • Nav atļauts mainīt nestatiskos datu locekļus.
  • Var izsaukt tikai citas konstantās metodes tā paša objekta.

Konstantu metožu mērķis:

  1. Drošība: Novērš nejaušu objekta stāvokļa maiņu.
  2. Izmantošana ar konstantiem objektiem: Konstanti objekti (deklarēti ar const) var izsaukt tikai konstantās metodes. Nekonstanti metodes tiem nav pieejamas.
  3. Pārlādēšana: Metodes var būt pārlādētas pēc konstantiem. Tas ļauj būt divām metodēm ar vienu un to pašu nosaukumu un parametru signatūru, bet viena būs konstanta, bet otra — nekonstanta. Kompilators izvēlēsies versiju atkarībā no tā, vai metode ir izsaukta uz konstanta vai nekonstanta objekta.
class MyClass {
    int value;
public:
    int getValue() const { // Konstanta versija
        return value;
    }
    int getValue() {       // Nekonstanta versija
        return value++;    // Izmaiņu iespēja
    }
};

void test(const MyClass& objConst, MyClass& objNonConst) {
    objConst.getValue();    // Izsauc konstanta versiju
    objNonConst.getValue(); // Izsauc nekonstanta versiju
}

Nekonstanta metodes:

Tie ir parasti klases metodes, kas var mainīt objekta stāvokli. Tās tiek deklarētas bez const atslēgas vārda pēc parametru saraksta.

Izmantošana:

Objekta tips Metodes izsaukums Kurš metodes tiks izsaukts Paskaidrojums
const T obj.method() Tikai konstanta Nav atļauts mainīt konstanta objekta stāvokli
T obj.method() Nekonstanta (ja ir) Nekonstanta metodes var mainīt stāvokli
T obj.method() const Konstanta (ja ir) Ja ir abas versijas un tiek izsaukts uz nekonstanta objekta, prioritāte ir nekonstanta. Bet var tieši izsaukt konstanta versiju, ja nepieciešams (retāk lietots).

Konstantu lietošana ir laba prakse, jo tā palielina koda lasāmību un drošību, kā arī ļauj kompilatoram veikt papildu optimizācijas.