Operator aritmatika biasanya digunakan untuk operasi aritmatika. Bukankah bagus untuk memiliki +, gabungkan dua string? Mengaktifkan yang dikatakan membebani operator penjumlahan aritmatika, untuk string.
Operator kenaikan, ++ menambahkan 1 ke int atau float. Saat berhadapan dengan pointer, itu tidak menambahkan 1 ke pointer. Itu membuat pointer menunjuk ke objek berturut-turut berikutnya dalam memori. Iterator menunjuk ke objek berikutnya dalam daftar tertaut, tetapi objek daftar tertaut berada di tempat yang berbeda di memori (bukan di wilayah berurutan). Bukankah lebih baik untuk membebani operator kenaikan untuk sebuah iterator, untuk menambah tetapi menunjuk ke elemen berikut, dalam daftar tertaut?
Artikel ini menjelaskan kelebihan beban di C++. Ini dibagi menjadi dua bagian: overloading fungsi dan overloading operator. Memiliki pengetahuan dasar dalam C++ diperlukan untuk memahami sisa artikel.
Isi Artikel
- Fungsi Kelebihan Beban
- Overload Operator
- Contoh Overloading Operator Kelas String
- Overload Operator Iterator
- Kesimpulan
Fungsi Kelebihan Beban
Fungsi berikut menambahkan dua int dan mengembalikan sebuah int:
int tambah(int no1, int no2)int jumlah = no1 + no2;
jumlah pengembalian;
Prototipe dari fungsi ini adalah:
int tambah(int no1, int no2);
Prototipe fungsi di header fungsi, diakhiri dengan titik koma. Fungsi berikut dengan nama yang sama, tetapi dengan prototipe yang berbeda, akan menambahkan tiga float dan mengembalikan float:
float add (float no1, float no2, float no3)
jumlah float = no1 + no2 + no3;
jumlah pengembalian;
Bagaimana kompiler membedakan fungsi mana yang dipanggil, karena dua atau lebih fungsi memiliki nama yang sama same? Kompiler menggunakan jumlah argumen dan tipe argumen untuk menentukan fungsi mana yang akan dipanggil. Daftar parameter fungsi yang kelebihan beban harus berbeda dalam jumlah dan/atau jenis parameternya. Jadi, panggilan fungsi,
int sm = tambah(2, 3);akan memanggil fungsi integer, sedangkan fungsi memanggil,
float sme = tambah(2.3, 3.4, 2.0);akan memanggil fungsi float. Catatan: ada situasi di mana kompiler akan menolak fungsi yang kelebihan beban ketika jumlah argumennya sama tetapi tipenya berbeda different! - Alasan: - lihat nanti.
Program berikut menempatkan segmen kode di atas ke dalam tindakan:
#termasukmenggunakan namespace std;
int tambah(int no1, int no2)
int jumlah = no1 + no2;
jumlah pengembalian;
float add (float no1, float no2, float no3)
jumlah float = no1 + no2 + no3;
jumlah pengembalian;
int utama()
int sm = tambah(2, 3);
cout<
cout<
Outputnya adalah:
5
7.7
Overload Operator
Operator aritmatika digunakan untuk membebani operasi dalam tipe kelas. Iterator adalah tipe kelas. Operator kenaikan dan penurunan digunakan untuk membebani operasi untuk iterator.
Contoh Overloading Operator Kelas String
Bagian ini memberikan contoh, di mana + kelebihan beban untuk kelas string yang dirancang sederhana, yang disebut kelas pegas. + menggabungkan literal dari dua objek string, mengembalikan objek baru dengan literal gabungan. Menggabungkan dua literal berarti menggabungkan literal kedua ke akhir literal pertama.
Sekarang, C++ memiliki fungsi anggota khusus untuk semua kelas, yang disebut operator. Pemrogram dapat menggunakan fungsi khusus ini untuk membebani operator, seperti: +. Program berikut menunjukkan kelebihan operator + untuk dua string.
#termasukmenggunakan namespace std;
musim semi kelas
publik:
//data anggota
char val[100];
int n;
char concat[100];
//fungsi anggota
pegas (char arr[])
untuk (int i=0; i<100; ++i)
val[i] = arr[i];
jika (arr[i] == '\0')
istirahat;
di aku;
untuk (i=0; i<100; ++i) if (arr[i] == '\0') break;
n = saya;
operator pegas+(pegas& st)
int newLen = n + st.n;
char newStr[newLen+1];
untuk (int i=0; i
pegas obj(newStr);
kembalikan obj;
;
int utama()
char ch1[] = "Aku membencimu! "; pegas str1(ch1);
char ch2[] = "Tapi dia mencintaimu!"; pegas str2(ch2);
char ch3[] = "satu"; pegas str3(ch3);
str3 = str1 + str2;
cout<
Nilai str1 adalah "Aku benci kamu! ". Nilai str2 adalah "Tapi dia mencintaimu loves!". Nilai str3, yaitu, str1 + str2, adalah outputnya:
"Aku membenci mu! Tapi dia mencintaimu!"
yang merupakan gabungan dari dua literal string. String itu sendiri adalah objek yang dipakai.
Definisi fungsi operator ada di dalam deskripsi (definisi) kelas string. Itu dimulai dengan tipe pengembalian, "pegas" untuk "string". Nama khusus, "operator, ikuti ini". Setelah itu, ada simbol operator (beban berlebih). Lalu ada daftar parameter, yang sebenarnya adalah daftar operan. + adalah operator biner: artinya dibutuhkan operan kiri dan kanan. Namun, dengan spesifikasi C++, daftar parameter di sini hanya memiliki parameter yang tepat. Lalu ada badan fungsi operator, yang meniru perilaku operator biasa.
Dengan spesifikasi C++, definisi operator + hanya mengambil parameter operan kanan, karena sisa deskripsi kelas adalah parameter operan kiri.
Dalam kode di atas, hanya definisi fungsi operator+(), yang berkaitan dengan + overloading. Sisa kode untuk kelas adalah pengkodean normal. Di dalam definisi ini, dua literal string digabungkan ke dalam array, newStr[]. Setelah itu, objek string baru benar-benar dibuat (dibuat), menggunakan argumen, newStr[]. Di akhir definisi fungsi operator+(), objek yang baru dibuat, memiliki string yang digabungkan, dikembalikan.
Dalam fungsi main(), penambahan dilakukan oleh pernyataan:
str3 = str1 + str2;Dimana str1, str2 dan str3 adalah objek string yang telah dibuat di main(). Ekspresi, “str1 + str2” dengan +-nya, memanggil fungsi anggota operator+() di objek str1. Fungsi anggota operator+() dalam objek str1 menggunakan str2 sebagai argumennya dan mengembalikan objek baru dengan (dikembangkan) string gabungan. Operator penugasan (=) dari pernyataan lengkap, menggantikan konten (nilai variabel) dari objek str3, dengan objek yang dikembalikan. Dalam fungsi main(), setelah penambahan, nilai anggota data str3.val tidak lagi "satu"; itu adalah string (tambahan) yang digabungkan, "Aku benci kamu! Tapi dia mencintaimu!". Fungsi anggota operator+() dalam objek str1, menggunakan literal string objeknya sendiri, dan literal string dari argumennya, str2 untuk menghasilkan string literal yang digabungkan.
Overload Operator Iterator
Ketika berhadapan dengan iterator, setidaknya ada dua objek yang terlibat: sebuah linked-list dan iterator itu sendiri. Faktanya, setidaknya ada dua kelas yang terlibat: kelas dari mana daftar tertaut dipakai, dan kelas dari mana iterator dipakai.
Daftar tertaut
Diagram untuk objek daftar tertaut ganda adalah:
Daftar ini memiliki tiga elemen, tetapi bisa lebih banyak lagi. Tiga elemen di sini adalah elemen bilangan bulat. Yang pertama memiliki nilai, 14; yang berikutnya memiliki nilai, 88; dan yang terakhir memiliki nilai, 47. Setiap elemen di sini terdiri dari tiga lokasi berurutan.
Ini tidak seperti array, di mana setiap elemen adalah satu lokasi, dan semua elemen array berada di lokasi yang berurutan. Di sini, elemen yang berbeda berada di tempat yang berbeda dalam rangkaian memori, tetapi setiap elemen terdiri dari tiga lokasi berurutan.
Untuk setiap elemen, lokasi tengah menyimpan nilai. Lokasi yang tepat memiliki penunjuk ke elemen berikutnya. Lokasi kiri memiliki penunjuk ke elemen sebelumnya. Untuk elemen terakhir, lokasi yang tepat menunjuk ke ujung teoritis dari daftar. Untuk elemen pertama, lokasi kiri menunjuk ke awal teoritis dari daftar.
Dengan array, operator increment (++), menambah pointer untuk menunjuk ke lokasi fisik berikutnya. Dengan daftar, elemen tidak berada di daerah berurutan dalam memori. Jadi, operator increment dapat kelebihan beban, pindahkan iterator (penunjuk) dari satu elemen ke elemen berikutnya secara logis. Proyeksi yang sama berlaku untuk operator penurunan (-).
Iterator maju adalah iterator yang ketika digunakan, menunjuk ke elemen berikutnya. Iterator terbalik adalah iterator, yang ketika diaktifkan, menunjuk ke elemen sebelumnya.
Memuat ++ iklan -
Overloading operator ini dilakukan dalam deskripsi kelas (definisi) dari iterator.
Sintaks untuk prototipe operator peningkatan kelebihan beban, awalan, adalah
Operator Tipe Pengembalian++();Sintaks untuk prototipe overloading operator increment, postfix, adalah
Operator Tipe Pengembalian++(int);Sintaks untuk prototipe operator penurunan overloading, prefix, adalah
Operator ReturnType--();Sintaks untuk prototipe overloading operator increment, postfix, adalah
Operator ReturnType--(int);Kesimpulan
Overloading berarti memberikan arti yang berbeda pada suatu fungsi atau operator. Fungsi kelebihan beban dalam lingkup yang sama. Yang membedakan fungsi kelebihan beban adalah jumlah dan/atau jenis parameter dalam daftar parameternya. Dalam beberapa kasus, di mana jumlah parameternya sama, tetapi dengan tipe yang berbeda, kompiler menolak kelebihan beban - lihat nanti. Banyak operator biasa dapat kelebihan beban di kelas dari mana objek dipakai objects. Ini dilakukan dengan memberikan tipe pengembalian, daftar parameter, dan isi, ke fungsi khusus bernama, operator, dalam deskripsi kelas.