Тағайындау операторы (C ++) - Assignment operator (C++)

Ішінде C ++ бағдарламалау тілі, тағайындау операторы, =, болып табылады оператор үшін қолданылған тапсырма. C ++ операторларының көпшілігі сияқты, болуы мүмкін шамадан тыс жүктелген.

The көшірме тағайындау операторы, көбінесе «тағайындау операторы» деп аталады, бұл тағайындау операторының көзі (оң жағы) мен тағайындалуы (сол жағы) бірдей класс типінде болатын ерекше жағдай. Бұл бірі арнайы мүшелік функциялар, демек, егер оның бағдарламалаушысы біреуін жарияламаса, оның әдепкі нұсқасын компилятор автоматты түрде жасайды. Әдепкі нұсқа мүшелікке сәйкес көшіруді орындайды, мұнда әр мүше өзінің көшірмесін тағайындау операторымен көшіріледі (ол бағдарламалаушы жариялауы немесе құрастырушы болуы мүмкін).

Көшіруді тағайындау операторының ерекшеленеді көшірме конструкторы ол тағайындаудың мақсатты элементтерінің мүшелерін тазартуы керек (және өзін-өзі тағайындауды дұрыс басқаруы керек), ал көшірме конструкторы инициализацияланбаған деректер мүшелеріне мән береді.[1] Мысалға:

My_Array бірінші;           // әдепкі конструктор бойынша инициализацияMy_Array екінші(бірінші);   // көшірме конструкторы арқылы инициализацияMy_Array үшінші = бірінші;   // Сонымен, инициализация көшірме конструкторы арқылыекінші = үшінші;           // көшірме тағайындау операторы арқылы тағайындау

Артық жүктелген оператордың мәнін қайтару

Тіл шамадан тыс жүктелген операторға ерікті қайтару түріне рұқсат береді (соның ішінде жарамсыз). Алайда, әдетте оператор операторға сілтеме қайтару үшін тағайындалады. Бұл кіріктірілген типтерге арналған тағайындау операторының әрекетіне сәйкес келеді (тағайындалған мәнді қайтару ) және оператордың шақыруын өрнек ретінде пайдалануға мүмкіндік береді, мысалы басқару операторларында немесе тізбектелген тағайындау. Сонымен қатар C ++ стандартты кітапханасы пайдаланушы ұсынатын кейбір түрлер үшін бұл мінез-құлықты қажет етеді.[2]

Көшіруді тағайындау операторының жүктемесі

Қашан терең көшірмелер нысандар жасалуы керек, ерекшелік қауіпсіздігі ескеру керек. Ресурстарды бөлу ешқашан сәтсіздікке ұшырағанда бұған қол жеткізудің бір әдісі:

  1. Жаңа ресурстарды сатып алыңыз
  2. Ескі ресурстарды босатыңыз
  3. Жаңа ресурстардың тұтқаларын объектіге тағайындаңыз
сынып My_Array{    int* массив;    int санау;қоғамдық:    My_Array& оператор=(const My_Array& басқа)    {        егер (бұл != &басқа) { // жарамсыз өзін-өзі тағайындаудан қорғаңыз            // 1: жаңа жадыны бөліп, элементтерін көшіру            int* жаңа_аралар = жаңа int[басқа.санау];            std::көшірме(басқа.массив, басқа.массив + басқа.санау, жаңа_арап);            // 2: ескі жадыны бөлу            жою[] массив;            // 3: объектке жаңа жадыны тағайындау            массив = жаңа_арап;            санау = басқа.санау;        }        // шарт бойынша әрқашан * мұны қайтарыңыз        қайту *бұл;    }    // ...};

Алайда, егерлақтыруға болмайды ) айырбастау функциясы барлық қатысушы субьектілер үшін қол жетімді және класс а көшірме конструкторы және деструктор (оны сәйкес жасауға тиіс үш ереже ), көшірмені тағайындауды жүзеге асырудың ең қарапайым әдісі:[3]

қоғамдық:    жарамсыз айырбастау(My_Array & басқа) // swap мүшесінің функциясы (ешқашан істен шықпауы керек!)    {        // барлық мүшелерді (егер мүмкін болса, негізгі суббъектті) басқалармен алмастырыңыз        қолдану std::айырбастау; // ADL болғандықтан компилятор қолданады         // егер ол бар болса, мүшелер үшін арнайы своп        // std :: swap-ға қайта оралу        айырбастау(массив, басқа.массив);        айырбастау(санау, басқа.санау);    }    My_Array & оператор = (My_Array басқа) // ескерту: аргумент мән бойынша өтті!    {        // басқасымен ауыстыру        айырбастау(басқа);        // шарт бойынша әрқашан * мұны қайтарыңыз        қайту *бұл;        // басқалары жадты босатып, жойылады    }

Әр түрлі сыныптар арасындағы тапсырма

C ++ әр түрлі кластар арасындағы тағайындауды, екеуі де жасырын түрде қолдайды көшірме конструкторы және тағайындау операторы, егер тағайындалған инстанция сыныбы бастапқы даналар сыныбының атасы болса:

сынып Арғы ата {қоғамдық:    int а;};сынып Ұрпақ : қоғамдық Арғы ата {қоғамдық:    int б;};int негізгі(){    Ұрпақ г.;    Арғы ата а(г.);    Арғы ата б(г.);    а = г.;}

Ұрпақ өрістерін инициализациясыз қалдыруы мүмкін атадан ұрпаққа көшіруге жол берілмейді.

Сондай-ақ қараңыз

Әдебиеттер тізімі

  1. ^ Stroustrup, Bjarne (2000). C ++ бағдарламалау тілі (3 басылым). Аддисон-Уэсли. б. 244. ISBN  978-0-201-70073-2.
  2. ^ Жұмыс жобасы, C ++ бағдарламалау тілінің стандарты, 17.6.3.1 бөлімі, 23 кесте; http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
  3. ^ Саттер, Х.; Александреску, А. (Қазан 2004), C ++ кодтау стандарттары, Аддисон-Уэсли, ISBN  0-321-11358-6

Сыртқы сілтемелер