class X{
const X & operator=(const X & r);
...
};
const X & X::operator=(const X & r){
if(this != &r){ // Көшіру
}
return *this;
}
Конструкторларда өрістерге бастапқы мəндер беру үшін меншіктеу опе-
рациясын емес, инициалдауды қолдану ұсынылады:
class Х{
string s;
public:
X(const char * str);
};
// Меншіктеуі бар конструктор нұсқасы:
X::X(const char * str){ s = str; }
// Инизиалдау қолданылған конструктор нұсқасы:
X::X(const char * str): s(str){}
Инициалдау басқаларына қарағанда, əмбебап əрекет болып табылады,
өйткені оның меншіктеуді пайдалануға болмайтын жағдайларда қолданылуы
мүмкін (мысалы, тұрақтылық өрістерге немесе сілтемелерге мəндер беру
кезінде). Сонымен қатар, ол тиімдірек жұмыс атқарады, себебі С++ тілінде
объектіні құру оның өрістерін келісім бойынша конструктордың инициал-
дауынан басталады, содан кейін барып шақырылатын конструктор орында-
лады. Осылайша, қарастырылған мысалдың бірінші нұсқасы үшін келісім
бойынша
string
класының конструкторы шақырылады да, тек содан кейін
барып меншіктеу орындалады, ал екінші нұсқа керекті конструкторды
бірден шақыруға мүмкіндік береді. Иерархия құрайтын күрделі кластар үшін
келтірілген нұсқалар арасындағы айырмашылық айтарлықтай үлкен болады.
Өрістердің инициалдануы олардың тізімдегі кездесу реттілігі бойынша
емес, жариялану реттілігі бойынша жүзеге асырылатынын да ескеру керек.
Сондықтан, мүмкін болатын қателіктер санын азайту үшін конструктордың
инициалдау тізіміндегі өрістерді жазу реті олардың класта жариялану
реттілігіне сəйкес келуі тиіс.
263
Статикалық өрістер конструкторда инициалданбауы тиіс, себебі оларға
бастапқы мəнді əрбір класс үшін тек бір рет меншіктеу керек, ал конструк-
тор кластың əрбір объектісі үшін орындалады. Статикалық өрістер ауқымды
анықталу аймағында (кез келген функциядан тыс) инициалданады.
Көшірме конструкторлары да өрістердің инициалдану тізімін қолдануы ке-
рек, өйткені базалық кластар жəне қабаттастырылған объектілер үшін келісім
бойынша анықталған конструкторлар шақырылады:
Достарыңызбен бөлісу: |