Бележки по ООП при 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); // Грешка!
}
Съпътстващи ресурси: