special member function
Főnév
special member function (tsz. special member functions)
- (informatika) A special member functions a C++-ban azok a speciális funkciók, amelyeket a fordító automatikusan generál a programozó által definiált osztályok számára, ha szükségesek. Ezek a funkciók alapvetőek a dinamikus memória kezelésében, az objektumok másolásában, áthelyezésében és törlésében. A következőkben részletesen bemutatom a legfontosabb specializált tagfüggvényeket, a konstruktorokat, másoló konstruktorokat, másoló rendelkező operátorokat, áthelyezési konstruktorokat, áthelyezési rendelkező operátorokat és destruktorokat.
- default constructor if no other constructor is explicitly declared.
- copy constructor if no move constructor and move assignment operator are explicitly declared.
- if a destructor is declared generation of a copy constructor is deprecated (c++11, proposal n3242[1]).
- move constructor if no copy constructor, copy assignment operator, move assignment operator and destructor are explicitly declared.
- copy assignment operator if no move constructor and move assignment operator are explicitly declared.
- if a destructor is declared, generation of a copy assignment operator is deprecated.
- move assignment operator if no copy constructor, copy assignment operator, move constructor and destructor are explicitly declared.
- destructor
1. Konstruktorok
A konstruktorok olyan tagfüggvények, amelyek az osztály objektumának létrehozásakor automatikusan meghívódnak. A konstruktorok feladata, hogy kezdeti értékeket rendeljenek az objektum adattagjaihoz, és általában az erőforrások foglalásáért is felelősek.
A C++-ban két típusú konstruktor létezik: - Alapértelmezett konstruktor: Ha nem definiálunk semmilyen konstruktort, a fordító automatikusan generál egy alapértelmezettet. Ha definiálunk egyet, akkor ezt használja az objektumok inicializálásakor. - Paraméterezett konstruktor: Lehetővé teszi, hogy paramétereket adjunk át a konstruktorban, hogy az objektumokat egyedi értékekkel inicializáljuk.
class MyClass {
public:
MyClass() { // Alapértelmezett konstruktor
std::cout << "Konstruktor hívás\n";
}
MyClass(int x) { // Paraméterezett konstruktor
std::cout << "Paraméterezett konstruktor: " << x << "\n";
}
};
2. Másoló konstruktor
A másoló konstruktor akkor lép működésbe, amikor egy objektumot másolunk egy másik objektumba. A másoló konstruktor a másolt objektum állapotát másolja át az új objektumba.
A másoló konstruktor szintaxisa:
MyClass(const MyClass& other);
Ez a konstruktor biztosítja, hogy az objektumok helyesen legyenek másolva, különösen, ha az osztály dinamikus memóriát használ. Ha nem definiáljuk, a fordító generál egy alapértelmezettet, de ez csak “shallow copy”-t végez (a mutatók másolása), nem pedig mély másolást.
Példa:
class MyClass {
public:
int* data;
MyClass(int value) {
data = new int(value); // dinamikus memóriafoglalás
}
MyClass(const MyClass& other) { // Másoló konstruktor
data = new int(*other.data); // Mély másolás
}
};
3. Másoló rendelkező operátor
A másoló rendelkező operátor egy olyan speciális tagfüggvény, amely lehetővé teszi az objektumok értékadását. Ez különösen akkor szükséges, amikor az osztály dinamikus memóriát használ. A másoló rendelkező operátor biztosítja, hogy a memória megfelelően legyen kezelve, és elkerülhető legyen a memóriaszivárgás.
A szintaxis:
MyClass& operator=(const MyClass& other);
Példa:
class MyClass {
public:
int* data;
MyClass(int value) {
data = new int(value);
}
MyClass& operator=(const MyClass& other) { // Másoló rendelkező operátor
if (this != &other) { // Ellenőrizzük az önmásolást
delete data;
data = new int(*other.data); // Mély másolás
}
return *this;
}
};
4. Áthelyezési konstruktor
Az áthelyezési konstruktor egy olyan speciális tagfüggvény, amely akkor használatos, amikor egy objektum erőforrásait át akarjuk helyezni egy másik objektumba, anélkül, hogy újra foglalnánk a memóriát. Az áthelyezési konstruktor általában akkor szükséges, amikor az objektumok átadása vagy visszatérése történik, hogy elkerüljük a felesleges másolásokat.
Szintaxis:
MyClass(MyClass&& other);
Példa:
class MyClass {
public:
int* data;
MyClass(int value) {
data = new int(value);
}
MyClass(MyClass&& other) noexcept { // Áthelyezési konstruktor
data = other.data; // Áthelyezés
other.data = nullptr; // A másik objektumot nullázza
}
};
5. Áthelyezési rendelkező operátor
Az áthelyezési rendelkező operátor az objektumok értékadásának áthelyezett verziója. Ahelyett, hogy új objektumot másolna, az áthelyezési rendelkező operátor átadja a forrás objektum erőforrásait a cél objektumnak, és biztosítja, hogy a forrás objektum ne tartalmazzon érvényes erőforrást.
Szintaxis:
MyClass& operator=(MyClass&& other);
Példa:
class MyClass {
public:
int* data;
MyClass(int value) {
data = new int(value);
}
MyClass& operator=(MyClass&& other) noexcept { // Áthelyezési rendelkező operátor
if (this != &other) {
delete data;
data = other.data;
other.data = nullptr; // A forrás objektumot nullázza
}
return *this;
}
};
6. Destruktor
A destruktor egy olyan tagfüggvény, amelyet akkor hívnak meg, amikor az objektum elpusztul. A destruktor felelős az objektum által használt erőforrások felszabadításáért, például a dinamikusan lefoglalt memória törléséért.
A destruktor szintaxisa:
~MyClass();
Példa:
class MyClass {
public:
int* data;
MyClass(int value) {
data = new int(value);
}
~MyClass() { // Destruktor
delete data;
}
};
Összegzés
A special member functions kulcsfontosságúak a C++ objektum-orientált programozásában, mivel segítenek az objektumok memóriájának és erőforrásainak helyes kezelésében. A konstruktorok, másoló konstruktorok, másoló rendelkező operátorok, áthelyezési konstruktorok, áthelyezési rendelkező operátorok és destruktorok mind hozzájárulnak az objektumok életciklusának kezeléséhez. A helyes alkalmazásuk segít elkerülni a memória szivárgást és biztosítja az optimális teljesítményt a C++ programokban.
- special member function - Szótár.net (en-hu)
- special member function - Sztaki (en-hu)
- special member function - Merriam–Webster
- special member function - Cambridge
- special member function - WordNet
- special member function - Яндекс (en-ru)
- special member function - Google (en-hu)
- special member function - Wikidata
- special member function - Wikipédia (angol)