Class C++
Class C++
Tujuan utama dari pemrograman C++ adalah untuk menambah object-oriented untuk bahasa pemrograman C. Class adalah fitur utama dari C + + yang mendukung pemrograman berorientasi obyek dan sering disebut tipe user-defined. Sebagai pemrograman berorientasi objek, pemograman ini berkaitan dengan object . Tentu saja, ini bukan bentuk kehidupan nyata obyek itu sendiri. Sebaliknya, obyek ini adalah definisi penting dari objek dunia nyata . Kelas adalah koleksi data yang terkait dengan jenis objek tunggal . Kelas tidak hanya mencakup informasi mengenai objek dunia nyata, tetapi juga berfungsi untuk mengakses data, dan kelas memiliki kemampuan untuk mewarisi dari kelas lain . !nheritance tercakup dalam pelajaran berikutnya . " #ika kelas adalah sebuah rumah , maka fungsi akan menjadi pintu-pintu dan $ariabel akan menjadi barang-barang dalam rumah. %ungsi biasanya akan menjadi satu-satunya cara untuk memodifikasi $ariabel dalam struktur ini, dan fungsi biasanya satu-satunya cara bahkan untuk mengakses $ariabel dalam struktur ini . &al ini mungkin tampak konyol pada awalnya, tetapi gagasan untuk membuat program yang lebih modular - prinsip sendiri disebut encapsulation enkapsulasi". !de utama adalah bahwa dunia luar tidak perlu tahu persis apa data disimpan di dalam kelas - hanya perlu tahu fungsi apa yang dapat digunakan untuk mengakses data tersebut. &al ini memudahkan implementasi karena perubahan dari fungsi di dalam kelas tidak berpengaruh terhadap kelas lain kecuali kelas itu sendiri. Sebuah kelas digunakan untuk menentukan bentuk sebuah obyek. Sebuah kelas menggabungkan representasi data dan metode untuk memanipulasi data ke dalam satu paket. Kelas merupakan konsep yang diperluas dari struktur data struct". 'ata dan fungsi dalam kelas disebut anggota kelas.
class class_name { access_specifier_1: member1; access_specifier_2: member2; ... } object_names; 'imana class*name merupakan identifier yang $alid untuk kelas , object*names adalah daftar opsional nama untuk objek dari kelas ini . Tubuh deklarasi dapat berisi anggota, yang dapat menjadi data atau deklarasi fungsi , dan secara opsional akses specifier. %ormatnya adalah sama seperti untuk struktur data biasa, kecuali bahwa mereka juga dapat mencakup fungsi , dan memiliki ini hal-hal baru yang disebut akses specifiers. (kses specifier adalah salah satu dari tiga kata kunci berikut ) private , public atau protected . Specifier ini memodifikasi hak akses bagi anggota yang mengikuti mereka ) anggota pri$ate dari kelas hanya dapat diakses dari dalam anggota lain dari kelas yang sama atau dari + friend+ mereka " . anggota protected dapat diakses dari anggota lain dari kelas yang sama atau dari + friend + mereka " , tetapi juga dari anggota turunan kelas mereka . (khirnya , anggota public dapat diakses dari mana saja objek itu terlihat . Secara default , semua anggota kelas dideklarasikan dengan kata kunci class memiliki akses pri$ate untuk semua anggotanya . ,leh karena itu , setiap anggota yang dideklarasikan sebelum specifier akses lainnya memiliki akses pri$ate secara otomatis . Sebagai contoh) class Rectangle { int width, height; public: void set_val es !int,int"; int area !void"; } rect; -endeklarasikan kelas yaitu, tipe data" yang disebut .ectangle dan obyek yaitu, $ariabel " kelas ini, yang disebut rect. Kelas ini berisi empat anggota) dua anggota data bertipe int width dan height" dengan akses pribadi secara default" dan dua anggota fungsi dengan akses publik) fungsi set_values dan area, yang untuk saat ini kita hanya termasuk deklarasi mereka, tetapi belum definisi mereka.
/erhatikan perbedaan antara nama kelas dan nama objek. /ada contoh di atas, rectangle adalah nama class yaitu, jenis", sedangkan rect adalah object dari tipe .ectangle. !ni adalah hubungan int yang sama dan memiliki dalam deklarasi berikut) int a; di mana int adalah tipe data kelas" dan a adalah nama $ariabel objek". Setelah deklarasi .ectangle dan rect, salah satu anggota publik dari objek rect dapat diakses seolah-olah mereka fungsi normal atau $ariabel normal, dengan hanya memasukkan sebuah titik ." (ntara nama objek dan nama anggota. !ni mengikuti sintaks yang sama seperti mengakses anggota struktur data biasa. Sebagai contoh) rect.set_val es !#,$"; m%area & rect.area!"; Satu-satunya anggota rect yang tidak dapat diakses dari luar kelas yang width dan height, karena mereka memiliki akses pribadi dan mereka hanya dapat disebut dari dalam anggota lain dari kelas yang sama. 0erikut adalah contoh lengkap dari kelas .ectangle) '' classes e(ample )incl de *iostream+ sing namespace std;
class Rectangle { int width, height; p blic: void set_val es !int,int"; int area!" {ret rn width,height;} };
int main !" { Rectangle rect; rect.set_val es !#,$"; co t ** -area: - ** rect.area!"; ret rn .; } ,utput dari fungsi di atas adalah) area: 12 Contoh ini memperkenalkan kembali operator scope )) , dua titik dua " , terlihat pada bab-bab sebelumnya dalam kaitannya dengan namespace. 'i sini digunakan dalam definisi fungsi set*$alues untuk mendefinisikan anggota kelas di luar kelas itu sendiri . /erhatikan bahwa definisi fungsi area telah dimasukkan langsung dalam definisi kelas .ectangle karena fungsinya sangat sederhana . Sebaliknya, set*$alues itu hanya dinyatakan dengan prototipe di dalam kelas , tetapi definisi di luar itu . 'alam definisi ini di luar , operator lingkup )) " digunakan untuk menentukan bahwa fungsi yang didefinisikan adalah anggota dari kelas .ectangle dan bukan fungsi biasa. ,perator scope )) " menjelaskan kelas di mana anggota yang dideklarasi, memperbolehkan lingkup properti yang sama seperti jika definisi fungsi ini langsung dimasukkan dalam definisi kelas . -isalnya, set*$alues fungsi pada contoh sebelumnya memiliki akses ke $ariabel width dan weight , yang merupakan anggota pri$ate kelas .ectangle , dan dengan demikian hanya dapat diakses dari anggota lain dari kelas, seperti ini. Satu-satunya perbedaan antara mendefinisikan fungsi anggota sepenuhnya dalam definisi kelas atau hanya menyertakan deklarasi dalam fungsi dan menentukan nanti di luar kelas , adalah bahwa dalam kasus pertama fungsi ini secara otomatis dianggap sebagai fungsi anggota inline oleh compiler , sementara di kedua itu adalah bukan - inline " fungsi anggota kelas normal. &al ini menyebabkan tidak ada perbedaan dalam perilaku , tetapi hanya pada kemungkinan optimasi kompilator . (nggota width dan height memiliki akses pri$ate ingat bahwa jika tidak ada lagi yang ditentukan , semua anggota kelas didefinisikan dengan kata kunci class memiliki akses pri$ate " . 'engan menyatakan mereka pri$ate, akses dari luar kelas tidak diperbolehkan . !ni masuk akal , karena kita telah mendefinisikan fungsi anggota untuk mengatur nilai-nilai bagi anggota dalam objek) set*$alues fungsi anggota . ,leh karena itu , sisa program tidak perlu memiliki akses langsung kepada mereka . -ungkin dalam contoh begitu sederhana seperti ini , sulit untuk melihat bagaimana membatasi akses ke $ariabel ini mungkin berguna , tetapi dalam proyek-
proyek yang lebih besar mungkin akan sangat penting bahwa nilai-nilai tidak dapat diubah dengan cara yang tak terduga tak terduga dari sudut pandang objek " . /roperti yang paling penting dari sebuah kelas adalah bahwa itu adalah sebuah tipe , dan dengan demikian , kita dapat mendeklarasikan beberapa objek itu . Sebagai contoh, berikut dengan contoh sebelumnya dari kelas .ectangle , kita bisa menyatakan rectb objek di samping objek rect ) '' e(ample: one class, two objects )incl de *iostream+ sing namespace std;
class Rectangle { int width, height; p blic: void set_val es !int,int"; int area !" {ret rn width,height;} };
int main !" { Rectangle rect, rectb; rect.set_val es !#,$"; rectb.set_val es !/,0"; co t ** -rect area: - ** rect.area!" ** endl; co t ** -rectb area: - ** rectb.area!" ** endl; ret rn .; }
,utput dari obyek di atas adalah) rect area: 12 rectb area: #. 'alam kasus ini, kelas tipe objek" adalah .ectangle, ada dua objek) rect dan rectb. -asingmasing dari mereka memiliki $ariabel anggota dan fungsi anggota sendiri. /erhatikan bahwa panggilan untuk rect.area " tidak memberikan hasil yang sama seperti panggilan rectb.area ". &al ini karena setiap objek dari kelas .ectangle telah $ariabelnya sendiri width dan height, karena mereka-dalam beberapa cara-juga memiliki fungsi anggota mereka sendiri set*$alue dan daerah yang beroperasi pada $ariabel anggota obyek itu sendiri. Kelas memungkinkan pemrograman menggunakan paradigma object-oriented) 'ata dan fungsi keduanya anggota objek, mengurangi kebutuhan untuk menggunakan penangan atau $ariabel obyek lain sebagai argumen untuk fungsi, karena mereka adalah bagian dari objek yang disebut anggota. /erhatikan bahwa panggilan ke rect.area atau rectb.area tidak menggunakan parameter. %ungsi-fungsi anggota langsung digunakan data anggota dari masing-masing objek rect dan rectb.
Constructor
(pa yang akan terjadi pada contoh sebelumnya jika area fungsi dipanggil sebelum set*$alues dipanggil1 Sebuah hasil yang belum ditentukan, karena anggota width dan height belum diberikan nilai. 2ntuk menghindari itu, kelas dapat mencakup fungsi khusus yang disebut construktor, yang secara otomatis dipanggil setiap kali objek baru dari kelas ini dibuat, memungkinkan kelas untuk menginisialisasi $ariabel anggota atau mengalokasikan memori. %ungsi constructor ini dinyatakan seperti fungsi anggota biasa, tapi dengan nama yang sesuai dengan nama kelas dan tanpa tipe kembali, bukan $oid. The .ectangle kelas di atas dapat dengan mudah diperbaiki dengan menerapkan constructor) '' e(ample: class constr ctor )incl de *iostream+ sing namespace std;
int main !" { Rectangle rect !#,$"; Rectangle rectb !/,0"; co t ** -rect area: - ** rect.area!" ** endl; co t ** -rectb area: - ** rectb.area!" ** endl; ret rn .; } ,utput dari program di atas adalah) rect area: 12 rectb area: #. &asil contoh ini identik dengan yang dari contoh sebelumnya. Tapi sekarang, kelas .ectangle tidak memiliki anggota fungsi set*$alues, dan memiliki bukan constructor yang melakukan aksi serupa) menginisialisasi nilai-nilai lebar dan tinggi dengan argumen yang dikirimkan ke sana. /erhatikan bagaimana argumen ini dilewatkan ke konstruktor pada saat di mana objek dari kelas ini diciptakan) Rectangle rect !#,$"; Rectangle rectb !/,0"; Konstruktor tidak bisa disebut secara eksplisit seolah-olah mereka fungsi anggota biasa. -ereka hanya dieksekusi sekali, ketika obyek baru dari kelas yang dibuat.
/erhatikan deklarasi prototipe konstruktor dalam kelas" maupun definisi konstruktor tidak memiliki nilai kembali, bahkan $oid) Konstruktor tidak pernah mengembalikan nilai, mereka hanya menginisialisasi hasil object.
Overloading Constructor
Seperti fungsi lain, konstruktor juga dapat di-o$erload dengan $ersi yang berbeda mengambil parameter yang berbeda) dengan jumlah parameter yang berbeda dan 3atau parameter dari berbagai jenis. Compiler secara otomatis akan memanggil jenis parameter cocok dengan argumen) '' overloading class constr ctors )incl de *iostream+ sing namespace std;
class Rectangle { int width, height; p blic: Rectangle !"; Rectangle !int,int"; int area !void" {ret rn !width,height";} };
int main !" { Rectangle rect !#,$"; Rectangle rectb; co t ** -rect area: - ** rect.area!" ** endl; co t ** -rectb area: - ** rectb.area!" ** endl; ret rn .; } &asil output dari program di atas adalah) rect area: 12 rectb area: 2/ 'alam contoh di atas, dua objek dari kelas .ectangle dibangun) rect dan rectb. rect dibangun dengan dua argumen, seperti dalam contoh sebelumnya. Tapi contoh ini juga memperkenalkan konstruktor jenis khusus) default constructor. 'efault constructor adalah constructor yang tidak mengambil parameter, dan itu adalah istimewa karena constructor itu dipanggil ketika suatu objek dideklarasi tetapi constructor ini tidak diinisialisasi dengan argumen. 'alam contoh di atas, default constructor dipanggil untuk rectb. /erhatikan bagaimana rectb bahkan tidak dipanggil dengan tanda ". Tanda " tidak dapat digunakan untuk memanggil default constructor. Rectangle rectb; '' o1, defa lt constr ctor dipanggil
Rectangle rectc!"; '' oops, defa lt constr ctor tida1 dipanggil &al ini karena tanda "akan membuat rectc dari deklarasi fungsi bukan deklarasi obyek) !ni akan menjadi sebuah fungsi yang tidak mengambil argumen dan mengembalikan nilai tipe .ectangle.
Uniform initialization
Cara memanggil konstruktor dengan melampirkan argumen mereka dalam tanda kurung, seperti yang ditunjukkan di atas, dikenal sebagai bentuk fungsional. Tapi konstruktor juga dapat disebut dengan sintaks lainnya) /ertama, konstruktor dengan parameter tunggal dapat pemanggil menggunakan $ariabel inisialisasi sintaks tanda 4 diikuti oleh argumen") class*name object*name 4 initiali5ation*$alue6 0aru-baru ini, C + + memperkenalkan kemungkinan konstruktor disebut dengan uniform initiali5ation, yang pada dasarnya adalah sama dengan bentuk fungsional, tetapi menggunakan
kurung kurawal 78" bukan tanda kurung "") class*name object*name 7$alue, nilai, nilai, ... 8 ,psional, sintaks terakhir ini dapat mencakup tanda sama sebelum kurung kurawal. 0erikut adalah contoh dengan empat cara untuk membangun objek dari kelas yang konstruktor mengambil parameter tunggal) '' classes and niform initiali2ation
class 3ircle { do ble radi s; p blic: 3ircle!do ble r" { radi s & r; } do ble circ m!" {ret rn 2,radi s,#.1$1/420/;} };
int main !" { 3ircle foo !1..."; 3ircle bar & 2...; 3ircle ba2 {#...}; '' f nctional form '' assignment init. '' niform init.
Sebuah keuntungan dari uniform initiali5ation dibanding bentuk fungsional adalah bahwa, tidak seperti tanda kurung ", tanda 78 tidak dapat disalahpahami dengan deklarasi fungsi, dan dengan demikian dapat digunakan untuk secara eksplisit memanggil konstruktor default)
'' defa lt constr ctor dipanggil '' de1larasi f ngsi !defa lt constr ctor <=8>?
Rectangle rectd{}; '' defa lt constr ctor dipanggil /ilihan sintaks untuk memanggil konstruktor sebagian besar adalah masalah gaya. Kebanyakan kode yang ada saat ini menggunakan bentuk fungsional, dan beberapa panduan gaya yang lebih baru menyarankan untuk memilih uniform initiali5ation, meskipun juga memiliki potensi jebakan untuk preferensinya initiali5er*list sebagai jenisnya.
-enginitialisasi semua anggota kelas secara default tidak selalu nyaman) dalam beberapa kasus, ini adalah membuang waktu bila anggota tersebut kemudian diinitialisai lagi dalam konstruktor", namun dalam beberapa kasus lain, konstruksi default tidak terjadi jika kelas tidak memiliki default constructor. 'alam kasus ini, anggota harus diinisialisasi dalam daftar inisialisasi anggota. Sebagai contoh) '' member initiali2ation )incl de *iostream+ sing namespace std;
class 3ircle { do ble radi s; p blic: 3ircle!do ble r" : radi s!r" { } do ble area!" {ret rn radi s,radi s,#.1$1/420/;} };
class 3%linder { 3ircle base; do ble height; p blic: 3%linder!do ble r, do ble h" : base !r", height!h" {} do ble vol me!" {ret rn base.area!" , height;} };
'alam contoh ini, kelas Cylinder memiliki objek anggota yang tipe kelas lain tipe dasar adalah Circle". Karena objek dari kelas Circle hanya dapat dibangun dengan parameter, konstruktor Cylinder yang butuh untuk memanggil constructor dasar, dan satu-satunya cara untuk melakukan ini adalah dalam daftar initiali5er anggota. !nisialisasi ini juga dapat menggunakan sintaks uniform initiali5er, menggunakan tanda 78 bukannya kurung ") 3%linder::3%linder !double r, double h" : base{r}, height{h} { }
class Rectangle { int width, height; p blic: Rectangle!int (, int %" : width!(", height!%" {} int area!void" { ret rn width , height; } };
int main!" { Rectangle obj !#, $"; Rectangle , foo, , bar, , ba2; foo & Aobj; bar & new Rectangle !/, 0"; ba2 & new RectangleB2C { {2,/}, {#,0} }; co t ** -obj:s area: - ** obj.area!" ** :;n:; co t ** -,foo:s area: - ** foo9+area!" ** :;n:; co t ** -,bar:s area: - ** bar9+area!" ** :;n:; co t ** -ba2B.C:s area:- ** ba2B.C.area!" ** :;n:; co t ** -ba2B1C:s area:- ** ba2B1C.area!" ** :;n:; delete bar; deleteBC ba2; ret rn .; } Contoh ini membuat penggunaan beberapa operator untuk beroperasi pada objek dan pointer operator :, ;,, -.9, <=". -ereka dapat diartikan sebagai)
expression
,( A( (.% (9+% !,(".% (B.C (B1C (BnC
can be read as pointed to by ( address of ( member % of object ( member % of object pointed to by ( member % of object pointed to by ( (equivalent to the previous one) first object pointed to by ( second object pointed to by ( (nD1)th object pointed to by (
Pointer this
Setiap objek di C + + memiliki akses ke alamat sendiri melalui pointer penting yang disebut pointer this. /ointer ini merupakan parameter implisit untuk semua fungsi anggota. ,leh karena itu, di dalam fungsi anggota, ini dapat digunakan untuk merujuk ke objek yang memanggil. %ungsi friend tidak memiliki pointer ini, karena friend bukan anggota kelas. &anya fungsi
anggota memiliki pointer ini. -ari kita coba contoh berikut untuk memahami konsep pointer ini) )incl de *iostream+
class Eo( { p blic: '' 3onstr ctor definition Eo(!do ble l&2.., do ble b&2.., do ble h&2.." { co t **-3onstr ctor called.- ** endl; length & l; breadth & b; height & h; } do ble Fol me!" { ret rn length , breadth , height; } int compare!Eo( bo(" { ret rn this9+Fol me!" + bo(.Fol me!"; } private: do ble length; do ble breadth; '' Gength of a bo( '' Ereadth of a bo(
do ble height; };
int main!void" { Eo( Eo(1!#.#, 1.2, 1./"; Eo( Eo(2!@./, 0.., 2.."; '' 8eclare bo(1 '' 8eclare bo(2
if!Eo(1.compare!Eo(2"" { co t ** -Eo(2 is smaller than Eo(1- **endl; } else { co t ** -Eo(2 is e5 al to or larger than Eo(1- **endl; } ret rn .; } Ketika kode di atas dikompilasi dan dijalankan, menghasilkan hasil sebagai berikut) 3onstr ctor called. 3onstr ctor called. Eo(2 is e5 al to or larger than Eo(1
bahwa konstruktor masih disebut dan diperbolehkan untuk menginisialisasi dan memodifikasi data anggota) '' constr ctor on const object )incl de *iostream+ sing namespace std;
class I%3lass { p blic: int (; I%3lass!int val" : (!val" {} int get!" {ret rn (;} };
int main!" { const I%3lass foo!1."; '' foo.( & 2.; co t ** foo.( ** :;n:; ret rn .; } %ungsi anggota dari obyek const hanya dapat dipanggil jika mereka sendiri ditetapkan sebagai anggota const, dalam contoh di atas, member get yang tidak ditentukan sebagai const" tidak dapat dipanggil dari foo. 2ntuk menentukan bahwa anggota adalah anggota const, kata kunci const harus mengikuti prototipe fungsi, setelah kurung tutup untuk parameter) int get!" const {ret rn (;} /erhatikan const yang dapat digunakan untuk memenuhi syarat jenis dikembalikan oleh fungsi anggota. Const ini tidak sama dengan yang yang menentukan anggota sebagai const. Keduanya independen dan berada di tempat yang berbeda dalam prototipe fungsi) int get!" const {ret rn (;} const intA get!" {ret rn (;} constA '' const member f nction '' member f nction ret rning a '' not valid: ( cannot be modified '' o1: data member ( can be read
const intA get!" const {ret rn (;} '' const member f nction ret rning a constA %ungsi anggota ditentukan untuk menjadi const tidak dapat memodifikasi anggota data nonstatis atau memanggil fungsi-fungsi anggota non-const lainnya. /ada intinya, anggota const tidak akan mengubah keadaan suatu objek. obyek const adalah terbatas untuk mengakses hanya anggota ditandai sebagai const, tetapi object non-const bisa mengakses kedua anggota const dan anggota non-const sama. (nda mungkin berpikir bahwa bagaimanapun (nda jarang akan mendeklarasikan obyek const, dan dengan demikian menandai semua anggota yang tidak memodifikasi objek sebagai const tidak penting. Tetapi obyek const sebenarnya sangat umum. Sebagian besar fungsi mengambil kelas sebagai parameter sebenarnya menggunakan referensi const, dan dengan demikian, fungsi-fungsi ini hanya dapat mengakses anggota const mereka) '' const objects )incl de *iostream+ sing namespace std;
class I%3lass { int (; p blic: I%3lass!int val" : (!val" {} const intA get!" const {ret rn (;} };
ret rn .; }
&asil output program adalah >?. #ika dalam contoh ini, jika get tidak ditetapkan sebagai anggota const, panggilan untuk arg.get " dalam fungsi print tidak akan mungkin, karena obyek const hanya memiliki akses ke fungsi anggota const. %ungsi anggota dapat di-o$erload pada const-ness mereka) yaitu, kelas mungkin memiliki dua fungsi anggota dengan tanda tangan identik kecuali satu yang const dan yang lainnya tidak) dalam hal ini, $ersi const disebut hanya ketika objek itu sendiri const, dan $ersi non-const disebut ketika objek itu sendiri non-const. '' overloading members on constness )incl de *iostream+ sing namespace std;
class I%3lass { int (; p blic: I%3lass!int val" : (!val" {} const intA get!" const {ret rn (;} intA get!" {ret rn (;} };
int main!" { I%3lass foo !1."; const I%3lass bar !2."; foo.get!" & 1/; '' bar.get!" & 2/; '' o1: get!" ret rns intA '' not valid: get!" ret rns const intA
%ungsi getter dan setter biasanya dideklarasi public sedangkan $ariable dideklarasi pri$ate.
@etter biasanya mulai dengan kata +get+. (nda mungkin telah memperhatikan kata kunci const setelah metode di bawah ini. &al ini menyatakan bahwa metode ini tidak akan mengubah nilai apapun dalam kelas. &al ini berguna karena memaksa (nda untuk tidak mengubah setiap nilai kelas. @etter biasanya tidak pernah mengubah nilai dari kelas dan oleh karena itu sehingga (nda dapat menempatkan const setelah prototype. '' Jetters int getHealth!" const { ret rn health; } int getIana!" const { ret rn mana; } Setter serupa dan mereka mulai dengan kata +set+. %ungsi mengambil parameter yang menentukan nilai baru. /erhatikan bahwa kata kunci const tidak digunakan sebagai (nda mengubah nilai dalam kelas. '' Ketters void setHealth!int h" { health & h; } void setIana!int m" { mana & m; } 'ata pri$ate adalah sebagai berikut) private :
int health; int mana; }; Contoh penggunaan setter dan getter diberikan di bawah ini. int main!" { 6la%er grant;
grant.setHealth!#.";
system!-pa se-";
ret rn .; }
@etter dan setter adalah teknik yang umum digunakan dalam pemrograman berorientasi objek. !ni adalah praktik yang baik untuk menggunakan getter dan setter ini bukannya mengubah $ariabel secara langsung.
Class Destructor
Sebuah destructor adalah fungsi anggota khusus dari kelas yang dijalankan setiap kali sebuah objek dari kelas itu keluar dari ruang lingkup atau pada saat ekspresi delete diterapkan untuk pointer ke objek dari kelas itu. 'estructor adalah lawan constructor. Sebuah destructor akan memiliki nama yang sama persis seperti kelas diawali dengan tilde A" dan tidak dapat mengembalikan nilai juga tidak dapat mengambil parameter apapun. 'estructor dapat sangat berguna untuk melepaskan sumber daya sebelum keluar dari program seperti menutup file, melepaskan memori. dll Contoh berikut menjelaskan konsep destructor) )incl de *iostream+
class Gine { p blic: void setGength! do ble len "; do ble getGength! void "; Gine!"; LGine!"; '' <his is the constr ctor declaration '' <his is the destr ctor: declaration
};
'' Iember f nctions definitions incl ding constr ctor Gine::Gine!void" { co t ** -7bject is being created- ** endl; } Gine::LGine!void" { co t ** -7bject is being deleted- ** endl; }
do ble Gine::getGength! void " { ret rn length; } '' Iain f nction for the program int main! " { Gine line;
ret rn .; } /ada saat dijalankan, hasil output adalah) 7bject is being created Gength of line : 0 7bject is being deleted -ari kita bayangkan bahwa kelas dalam contoh terakhir mengalokasikan memori dinamis untuk menyimpan string itu sebagai anggota data, dalam hal ini, akan sangat berguna untuk memiliki fungsi yang disebut secara otomatis pada akhir kehidupan objek bertugas melepaskan memori ini . 2ntuk melakukan ini, kita menggunakan destructor. '' destr ctors )incl de *iostream+ )incl de *string+ sing namespace std;
class M(ample$ { string, ptr; p blic: '' constr ctors: M(ample$!" : ptr!new string" {} M(ample$ !const stringA str" : ptr!new string!str"" {} '' destr ctor: LM(ample$ !" {delete ptr;} '' access content: const stringA content!" const {ret rn ,ptr;} };
co t ** -bar:s content: - ** bar.content!" ** :;n:; ret rn .; } &asil output) bar:s content: M(ample /ada konstruksi, BCampleD mengalokasikan penyimpanan untuk string. Storage yang kemudian dirilis oleh destructor. 'estructor untuk suatu benda dipanggil pada akhir masa hidupnya, dalam kasus foo dan bar ini terjadi pada akhir fungsi main.
References:
http)33www.cplusplus.com3doc3tutorial3classes3 http)33www.cplusplus.com3doc3tutorial3templates3 http)33www.cplusplus.com3doc3tutorial3classesE3 http)33www.cplusplus.com3doc3tutorial3inheritance3 http)33www.cplusplus.com3doc3tutorial3polymorphism3 http)33www.cplusplus.com3doc3tutorial3typecasting3