logo

„šis“ žymeklis C++

Norint suprasti „šį“ žymeklį, svarbu žinoti, kaip objektai žiūri į klasės funkcijas ir duomenų narius.

  1. Kiekvienas objektas gauna savo duomenų nario kopiją.
  2. Visa prieiga prie tos pačios funkcijos apibrėžimo, kaip ir kodo segmente.

Tai reiškia, kad kiekvienas objektas gauna savo duomenų narių kopiją, o visi objektai turi vieną narių funkcijų kopiją.
Dabar kyla klausimas, kad jei egzistuoja tik viena kiekvienos nario funkcijos kopija ir ją naudoja keli objektai, kaip pasiekiami ir atnaujinami tinkami duomenų nariai?
Kompiliatorius pateikia numanomą rodyklę kartu su funkcijų pavadinimais kaip „tai“.
Rodyklė „šis“ perduodama kaip paslėptas argumentas visiems nestatinių narių funkcijų iškvietimams ir yra pasiekiamas kaip vietinis kintamasis visų nestatinių funkcijų turinyje.„šis“ žymeklis nepasiekiamas statinėse narių funkcijose, nes statinės narių funkcijos gali būti iškviečiamos be jokio objekto (su klasės pavadinimu).
X klasėje šios rodyklės tipas yra „X*“. Be to, jei X nario funkcija deklaruojama kaip const, tada šios rodyklės tipas yra „const X *“ (žr. šį GFact )



Ankstesnėje C++ versijoje leis „šį“ žymeklį pakeisti; tai darydamas programuotojas gali pakeisti objektą, kuriame veikia metodas. Galiausiai ši funkcija buvo pašalinta, o dabar C++ tai yra r reikšmė.
C++ leidžia objektui sunaikinti save iškviečiant šį kodą:




e-r modelio schema





delete> this>;>

>

>

Kaip sakė Stroustrup, „tai“ gali būti nuoroda, o ne rodyklė, tačiau nuorodos nebuvo ankstyvojoje C++ versijoje. Jei „tai“ bus įgyvendinta kaip nuoroda, aukščiau nurodytos problemos būtų galima išvengti ir ji gali būti saugesnė nei žymeklis.

Toliau pateikiamos situacijos, kai naudojamas „šis“ žymeklis:

1) Kai vietinio kintamojo pavadinimas yra toks pat kaip ir nario vardas




poslinkio aukštis

#include> using> namespace> std;> > /* local variable is same as a member's name */> class> Test> {> private>:> >int> x;> public>:> >void> setX (>int> x)> >{> >// The 'this' pointer is used to retrieve the object's x> >// hidden by the local variable 'x'> >this>->x = x;>> }> >void> print() { cout <<>'x = '> << x << endl; }> };> > int> main()> {> >Test obj;> >int> x = 20;> >obj.setX(x);> >obj.print();> >return> 0;> }>

>

>

Išvestis:

 x = 20>

Konstruktoriams, iniciatorių sąrašas taip pat gali būti naudojamas, kai parametro pavadinimas yra toks pat kaip ir nario vardas.



2) Grąžinti nuorodą į skambinantį objektą




/* Reference to the calling object can be returned */> Test& Test::func ()> {> >// Some processing> >return> *>this>;> }>

>

>

Kai grąžinama nuoroda į vietinį objektą, grąžinta nuoroda gali būti naudojama grandinės funkcijos skambučiai ant vieno objekto.




#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test(>int> x = 0,>int> y = 0) {>this>->x = x;>>->y = y; }> >Test &setX(>int> a) { x = a;>return> *>this>; }> >Test &setY(>int> b) { y = b;>return> *>this>; }> >void> print() { cout <<>'x = '> << x <<>' y = '> << y << endl; }> };> > int> main()> {> >Test obj1(5, 5);> > >// Chained function calls. All calls modify the same object> >// as the same object is returned by reference> >obj1.setX(10).setY(20);> > >obj1.print();> >return> 0;> }>

>

>

Išvestis:

greibacho normali forma
x = 10 y = 20>



Pratimas:
Numatykite šių programų išvestį. Jei yra kompiliavimo klaidų, ištaisykite jas.

Klausimas 1




#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> public>:> >Test(>int> x = 0) {>this>->x = x; }> >void> change(Test *t) {>this> = t; }> >void> print() { cout <<>'x = '> << x << endl; }> };> > int> main()> {> >Test obj(5);> >Test *ptr =>new> Test (10);> >obj.change(ptr);> >obj.print();> >return> 0;> }>

>

>



2 klausimas




#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test(>int> x = 0,>int> y = 0) {>this>->x = x;>>->y = y; }> >static> void> fun1() { cout <<>'Inside fun1()'>; }> >static> void> fun2() { cout <<>'Inside fun2()'>;>this>->smagu1(); }> };> > int> main()> {> >Test obj;> >obj.fun2();> >return> 0;> }>

>

skaičiuoti skirtingai

>



3 klausimas




#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test (>int> x = 0,>int> y = 0) {>this>->x = x;>>->y = y; }> >Test setX(>int> a) { x = a;>return> *>this>; }> >Test setY(>int> b) { y = b;>return> *>this>; }> >void> print() { cout <<>'x = '> << x <<>' y = '> << y << endl; }> };> > int> main()> {> >Test obj1;> >obj1.setX(10).setY(20);> >obj1.print();> >return> 0;> }>

>

>



4 klausimas




gb prieš mb

#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test(>int> x = 0,>int> y = 0) {>this>->x = x;>>->y = y; }> >void> setX(>int> a) { x = a; }> >void> setY(>int> b) { y = b; }> >void> destroy() {>delete> this>; }> >void> print() { cout <<>'x = '> << x <<>' y = '> << y << endl; }> };> > int> main()> {> >Test obj;> >obj.destroy();> >obj.print();> >return> 0;> }>

>

>