Jump to content

Бележки по ООП при C++ - ООП, КН, 2025-2026

Този документ съдържа редица полезна информация и детайли относно обектно-ориентираното програмиране при C++.

Голяма петица формат

class X {
    Y* elements;
    unsigned elementsCount;

    void free() {
        delete[] elements;
    }
    void copyFrom(const X& other) {
        elementsCount = other.elementsCount;

        elements = new Y[elementsCount];
        for (unsigned i = 0; i < elementsCount; ++i)
            elements[i] = other.elements[i];
    }

public:
    X() {
        elements = nullptr;
        elementsCount = 0;
    }
    ~X() {
        free();
    }
    X(const X& other) {
        copyFrom(other);
    }
    X& operator=(const X& other) {
        if (this != &other) {
            free();
            copyFrom(other);
        }
        return *this;
    }

    X(X&& other) {
        elements = other.elements;
        elementsCount = other.elementsCount;

        other.elements = nullptr;
        other.elementsCount = 0;
    }
    X& operator=(X&& other) {
        if (this != &other) {
            free();

            elements = other.elements;
            elementsCount = other.elementsCount;

            other.elements = nullptr;
            other.elementsCount = 0;
        }
        return *this;
    }
};

&&A, rvalue и rvalue reference

lvalue е всяка стойност, която има "име". Това са аргументи на функции, променливи, ...

rvalue е всяка стойност за която нямаме "име". Най-често срещаните са върнатите стойноти от функция/оператор. Тези стойности са временни и идеята е че ще бъдат изтрити (и на практика, данните им ще бъдат копирани/пренесени в нещо с име, lvalue).

Можем да правим референции върху rvalue:

A&& rvalueRef = functionWhichReturnsA();

Обаче, тези референции дават (временно) име към rvalue-то. Това означава, че те самите стават lvalue.

Поради тази прична не можем да имаме повече от една rvalue референция към едно rvalue:

A&& ref1 = functionWhichReturnsA();
A&& ref2 = ref1; // Грешка!

И не можем да подаваме аргумент rvalue на друга функция:

void foo(A&& ref1) {
    ...
}
void bar(A&& ref2) {
    foo(ref2); // Грешка!
}



Съпътстващи ресурси: